Django get_or_create выдает ошибки целостности

Я так запутался, почему метод get_or_create() должен вызывать здесь ошибку, у меня есть это в моем сериализаторе:

def create(self, validated_data): пользователь, _ = User.objects.get_or_create(id=validated_data['сообщение']['from_user']['id'], defaults=validated_data['сообщение']['from_user'] )

chat, created = Chat.objects.get_or_create(id=validated_data['message']['chat']['id'],
                                           defaults=validated_data['message']['chat'])

message, _ = Message.objects.get_or_create(message_id=validated_data['message']['message_id'],
                                           defaults={'message_id': validated_data['message']['message_id'],
                                           'from_user': user,
                                           'date': validated_data['message']['date'],
                                           'chat': chat,
                                           'text': validated_data['message']['text']})
update, _ = Update.objects.get_or_create(update_id=validated_data['update_id'],
                                         defaults={'update_id': validated_data['update_id'],
                                         'message': message})

return update

Там написано: {u'from': {'id': [u'User with this id already exists.']}, u'chat': {'id': [u'Chat with this id already exists.']}}

Я проверил другие потоки, но решение, которое они все дали, - это то, что у меня уже есть в моем коде, поэтому я действительно запутался.


person Ken    schedule 25.12.2016    source источник


Ответы (1)


Похоже, проблема заключалась в том, что сериализатор не мог неявно преобразовать идентификаторы в целые числа, даже если они указаны в модели как целые числа. Поэтому всякий раз, когда он пытался найти чат или пользователя с заданным идентификатором, он не находил его (возможно, использует строковые идентификаторы), но попытка создать новый объект с заданным идентификатором заставит БД (в данном случае postgreSQL) выдать целостность ошибка. Добавление id = serializers.IntegerField() решило проблему

person Ken    schedule 25.12.2016