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)

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

Изменить: я также понял, что указанные ошибки равны количеству полей в модели, которая является ReferenceField. В данном случае группировка имеет 16 полей.


person Jared Joke    schedule 09.07.2013    source источник


Ответы (2)


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

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

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

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

person Jared Joke    schedule 09.07.2013

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

В MongoEngine Documents и 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)
person Ross    schedule 10.07.2013