2013-07-09 3 views
1

В принципе что-то вроде этогоMongoengine бросать тонны ошибок проверки при сохранении модели

ValidationError (MatterUser:51dc53babc6163617b38c2fe) (A ReferenceField only accepts DBRef or documents 1.A ReferenceField only accepts DBRef or documents 2.A ReferenceField only accepts DBRef or documents 3.A ReferenceField only accepts DBRef or documents 4.A ReferenceField only accepts DBRef or documents 5.A ReferenceField only accepts DBRef or documents 6.A ReferenceField only accepts DBRef or documents 7.A ReferenceField only accepts DBRef or documents 8.A ReferenceField only accepts DBRef or documents 9.A ReferenceField only accepts DBRef or documents 10.A ReferenceField only accepts DBRef or documents 11.A ReferenceField only accepts DBRef or documents 12.A ReferenceField only accepts DBRef or documents 13.A ReferenceField only accepts DBRef or documents 14.A ReferenceField only accepts DBRef or documents 15.A ReferenceField only accepts DBRef or documents 16.A ReferenceField only accepts DBRef or documents: ['groups']) 

Мои модели кажется правильным, хотя (только показывать соответствующие биты)

class MatterUser(Document): 
    groups = ListField(ReferenceField('Grouping')) 
    homeGroup = ReferenceField('Grouping') 
    ... 


class PermissionHolder(Document): 
    meta = {'allow_inheritance': True} 
    ... 

class Grouping(PermissionHolder): 
    ... 

И звонки в представлениях идет как

def createGroup(info): 
    group = Grouping() 
    group.save() 
    info['owner'].groups+=group 
    info['owner'].save() # The offending line 

... 

newUser = MatterUser(...) 
newUser.save() 
info = {'owner': newUser,...} 
newUser.homeGroup = createGroup(info) 

То, что я не понимаю, - это то, почему я получаю так много ошибок проверки или даже проблему.

Редактировать: Я также понял, что приведенные ошибки равны количеству полей в модели, которая является ссылочным полюсом. В этом случае Grouping имеет 16 полей

ответ

1

Ugh, наконец, понял это. Из-за того, как mongoengine ссылается на документы и способ управления python + = при добавлении вещей в список, он в основном пытался добавить каждое отдельное поле в список.

Когда я изменил его на

info['owner'].groups.append(group) 

Он выполнил намеченное поведение и был безошибочная

1

В питоне делает += в список требует элемента, который вы добавляете быть итерацией. Затем каждый отдельный элемент будет добавлен в список.

В MongoEngine Документы и EmbeddedDocuments являются итерацию и вернуть имена полей, например:

class Participant(EmbeddedDocument): 
    first_name = StringField() 
    last_name = StringField() 

participant = Participant(first_name="Ross", last_name="Lawley") 

Теперь вы можете распаковать документ в переменные для имени поля, например:

field1_name, field2_name = participant 

Вот почему вам получают ошибку проверки += добавляет каждое имя поля в список groups. Вы правы в том, что вы действительно хотите сделать, это добавить один элемент в свой список, например:

info['owner'].groups.append(group)