2014-01-20 3 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 Пользователя арийского (или просто установить его, чтобы быть арийским пользовательским объект), например:

aryan = User.objects(name="aryan").first() 
device = DeviceDetails(profile=aryan, enduser='two', model='nokia').save() 
Смежные вопросы