django-nonrel: добавить элемент в LisftField из ForeignKeys

Я пытаюсь реализовать список foreignKeys в django-nonrel (я использую mongo как db).

Вот код:

# models.py
from django.db import models
from django_mongodb_engine.contrib import MongoDBManager
from djangotoolbox.fields import ListField

class FriendList(models.Model):
    objects = MongoDBManager()
    list = ListField(models.ForeignKey('AWUser'))

    def add_friend(self, awuser):
        # awuser must be an instance of AWUser - I removed tests for more clarity
        self.list.append(awuser)
        self.save()

class AWUser(models.Model):
    objects = CustomUserManager()
    user = EmbeddedModelField('User')
    friends = EmbeddedModelField('FriendList')

Проблема в том, что когда я вызываю user.friends.add_friend (user1), у меня появляется ошибка «AttributeError: объект 'str' не имеет атрибута '_meta'».

Пример взлома (сделанный с использованием консоли оболочки ./manage):

$>user = AWUser.objects.all()[0]
$>user1 = AWUser.objects.all()[1]
$>user.friends.add_friend(user1)
#ask me if you need the complete error - I don't put it more more clarity
AttributeError: 'str' object has no attribute '_meta'

В основном мне нужно создавать списки друзей.
Пожалуйста, не стесняйтесь порекомендовать другой вариант, если вы считаете, что моя не подходит. :) Я бы хотел, чтобы моя реализация работала ...
Кроме того, я не поместил все переменные AWUser для большей ясности, но я могу добавить их, если необходимо.

Связанные зависимости проекта:

  • django 1.3.1 (установлен как django-nonrel)
  • django-mongodb-engine 0.4.0
  • djangotoolbox == 0.9.2
  • Пункт списка
  • пимонго == 2.1.1

Спасибо за вашу помощь.

ОБНОВИТЬ:

Я попытался изменить код, как сказано в сообщении «ListField с ForeignField в django-nonrel ", но у меня все еще та же ошибка ...


person koleror    schedule 06.02.2013    source источник


Ответы (2)


Согласно документации Django MongoDB Engine, он предлагает использовать EmbeddedModel из djangotoolbox:

from djangotoolbox.fields import ListField, EmbeddedModelField

class Post(models.Model):
    ...
    comments = ListField(EmbeddedModelField('Comment'))

class Comment(models.Model):
    text = models.TextField()

Изменить: забыл ссылку: http://django-mongodb-engine.readthedocs.org/en/latest/topics/embedded-models.html

person jliles    schedule 07.08.2014

На самом деле я только что понял, в чем дело. Очевидно, невозможно объявить тип класса внешнего ключа как строку в поле списка. Странно ...
Если это произойдет с вами, просто внесите следующие изменения:

list = ListField(models.ForeignKey('AWUser'))

становится:

list = ListField(models.ForeignKey(AWUser))

Если кто-нибудь как хорошее объяснение происходящего, я хотел бы это услышать :)

person koleror    schedule 07.02.2013