2014-01-20 43 views
1

我有一些非常簡單的代碼:EmbeddedDocumentField和ReferenceField在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) 

,每一個用戶都會有一些設備的細節和一些談話連接到每一個設備的細節。對話正在被附加到每個DeviceDetails如下所述: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'>] 

誰能告訴我什麼,我做錯了什麼?

回答

2

根據您的模式Profile是一個引用字段,這意味着它將存儲它引用的對象的id。

你應該將其設置爲用戶的雅利安人(或只是將其設置爲雅利安用戶對象)的id如:

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