0

我正在尝试在 django-nonrel 中实现一个外键列表(我使用 mongo 作为数据库)。

这是代码:

# 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' object has no attribute '_meta'"

突破性示例(使用 ./manage shell 控制台制作):

$>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
  • 项目清单
  • pymongo==2.1.1

谢谢你的帮助。

更新:

我尝试按照帖子“ ListField with ForeignField in django-nonrel ”中所述更改代码,但我仍然遇到相同的错误...

4

2 回答 2

1

根据 Django MongoDB Engine 文档,它建议使用 djangotoolbox 中的 EmbeddedModel:

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

于 2014-08-07T15:11:16.037 回答
0

我实际上只是想出了什么问题。在 Listfield 中,显然不可能将外键类类型声明为字符串。奇怪......
如果它发生在你身上,只需进行以下更改:

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

变成:

list = ListField(models.ForeignKey(AWUser))

如果有人能很好地解释发生了什么,我很想听听:)

于 2013-02-07T00:43:31.247 回答