python - mongoengine中的EmbeddedDocumentField和ReferenceField

标签 python mongodb mongoengine

我有一些非常简单的代码:

class User(db.Document):
   username = db.StringField(max_length=25)
   userid = db.StringField(max_length=25)
   password = db.StringField(max_length=25)

   def __repr__(self):
    return '<User %r>' % (self.username)


class DeviceDetails(db.Document):
    profile = ReferenceField(User)
    enduser = db.StringField(max_length=30, required = True)
    model = db.StringField(max_length=25,required = True)
    conversation = db.ListField(db.EmbeddedDocumentField('Conversation'))

   def __repr__(self):
       return self.enduser

class Conversation(db.EmbeddedDocument):
    message = db.StringField(max_length=250)

其中每个用户都会有一些设备详细信息以及链接到每个设备详细信息的一些对话。对话将附加到每个设备详细信息,如下所述:What is the difference between EmbeddedDocumentField and ReferenceField in mongoengine 运行良好。

现在我希望将用户关联到 DeviceDetails。我尝试添加上面“链接”中提到的代码。但出现错误:

>>> from feed.models import *
>>> d = DeviceDetails(
... profile = 'aryan',
... enduser = 'two',
... model = 'nokia'
... )
Traceback (most recent call last):
File "<console>", line 8, in <module>
File "/home/anurag/virtual/vir/lib/python2.7/site-packages/mongoengine                
/base/document.py", line 85, in __init__
value = field.to_python(value)
File "/home/anurag/virtual/vir/lib/python2.7/site-packages/mongoengine/fields.py",   
line 937, in to_python
value = DBRef(collection, self.document_type.id.to_python(value))
File "/home/anurag/virtual/vir/lib/python2.7/site-packages/mongoengine
/base/fields.py", line 392, in to_python
value = ObjectId(value)
File "/home/anurag/virtual/vir/lib/python2.7/site-packages/bson/objectid.py", line 90,
in __init__
self.__validate(oid)
File "/home/anurag/virtual/vir/lib/python2.7/site-packages/bson/objectid.py", line 
194, in __validate
raise InvalidId("%s is not a valid ObjectId" % oid)

InvalidId: aryan is not a valid ObjectId

我在用户模型中有一些用户:

>>> User.objects.all()
[<User u'anurag'>, <User u'aryan'>]

谁能告诉我我在这里做错了什么?

最佳答案

根据您的架构,Profile 是一个引用字段,这意味着它将存储它引用的对象的 id。

您应该将其设置为用户雅利安人的id(或者只是将其设置为雅利安用户对象),例如:

aryan = User.objects(name="aryan").first()
device = DeviceDetails(profile=aryan, enduser='two', model='nokia').save()

关于python - mongoengine中的EmbeddedDocumentField和ReferenceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21228648/

相关文章:

node.js - Express js,mongodb : "ReferenceError: db is not defined" when db is mentioned outside post function

python - MongoEngine 中如何让引用字段接受多个文档模式?

python - 在 Python 中获取 Exchange 分发列表的成员

MongoDB - 运行 setFeatureCompatibilityVersion 需要什么特权?

linux - 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

python - Flask、MongoEngine、Wtforms - 正确呈现密码字段和日期时间字段

python - 从mongoengine中的另一个嵌入式文档访问嵌入式文档

python - Shell 脚本无法识别别名

python - 在 Jinja2 中使用 getattr 给我一个错误(jinja2.exceptions.UndefinedError : 'getattr' is undefined)

python - 在 Python 中从每组行索引中的多个列中查找最大值,将这些值按对角线排列在矩阵中,并找到行列式