NotUniqueError с использованием django и mongoengine

Я использую django и mongoengine. Это ошибка, которую я получаю снова и снова, когда пытаюсь сохранить вновь созданный экземпляр с помощью метода.save(). Мне удалось создать экземпляр модели в первый раз, но после этого любой пост-запрос вызывает эту ошибку. Вот моя структура документа:

class Client(DynamicDocument):
   name = fields.StringField(required=True,max_length=30) 
   uuid = fields.UUIDField(default=uuid.uuid4())
   contactEmail = fields.EmailField(required=True,max_length=30)
   contactPhone = fields.StringField(required=True,max_length=30)
   contactPerson = fields.StringField(required=True,max_length=30)

class ClientSerializer(mongoserializers.DocumentSerializer):

    class Meta:
        model = Client
        fields = ('id','name','uuid','contactEmail','contactPhone','contactPerson')

и вот где я делаю почтовый запрос:

def post(self, request, format=None):
    serializer = ClientSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

но я ловлю ошибку:

NotUniqueError: Попытка сохранить дублирующиеся уникальные ключи (E11000 коллекция ошибок дубликатов ключей: project.client index: UUID_1 dup key: {: null })

Я застрял здесь. Пожалуйста, скажите мне, где я ошибся, так как я новичок в django. Любая помощь будет высоко ценится.

2 ответа

Вам нужно установить default как функцию: попробуйте удалить скобки:

uuid = fields.UUIDField(default=uuid.uuid4())
#                                         ^^^

в

uuid = fields.UUIDField(default=uuid.uuid4)
#                                        ^^^

и попробуйте в сериализаторе, явно объявив поле uuid:

class ClientSerializer(mongoserializers.DocumentSerializer):
    uuid = serializers.UUIDField()

Django - это веб-фреймворк, основанный на реляционном бэкэнде (например, sql) для сохранения всех своих моделей. С другой стороны, MongoEngine - это оболочка ORM для MongoDB. Django имеет свою собственную оболочку типа ORM в виде моделей.

Чтобы использовать Django с MongoEngine, либо попробуйте Django-nonrel, либо попробуйте djongo, который соединяет реляционный Django с MongoDB.

Использование моделей Django с MongoEngine не всегда будет работать. В качестве альтернативы лучше использовать MongoEngine ORM для сохранения ваших моделей.

Другие вопросы по тегам