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 полей
2 ответа
Тьфу, наконец, понял это. Из-за того, как mongoengine ссылается на документы и как Python обрабатывает += при добавлении элементов в список, он в основном пытался добавить каждое поле в список.
Когда я изменил это на
info['owner'].groups.append(group)
Он выполнял намеченное поведение и был без ошибок
В питоне +=
для списка требуется, чтобы элемент, который вы добавляете, был итеративным. Затем каждый отдельный элемент будет добавлен в список.
В 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)