Django create_or_update получить поля изменений - PullRequest
0 голосов
/ 18 июня 2020

Я использую функцию Django create_or_update.

В случае обновления, есть ли способ узнать список измененных полей.

Очевидно, я могу использовать get_or_create до и в случае, если после этого я могу обновить модель .. но я ищу способ получить это с помощью одного запроса.

Возможно ли?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Может быть, это не лучшее решение, но я думаю, что оно выполняет свою работу. Вы можете получить экземпляр, который будет обновлен, а затем вычислить поля, которые изменились, используя filter () и лямбда-функции, как это предлагается в этом ответе Рахула Гупты.

Предположим, вы можете идентифицируйте экземпляр, скажем, first_name и last_name, как указано в docs :

old_instance = Person.objects.filter(first_name=first_name, last_name=last_name)
old_instance = old_instance[0] if old_instance else None

new_instance, created = Person.objects.update_or_create(
    first_name=first_name, last_name=last_name,
    defaults={'first_name': 'Bob'},
)

# it's been updated and we have the old instance
if not created and old_instance:
    # get a list of the model's fields
    fields = Person._meta.get_all_field_names()
    # compute the fields which have changed
    diff_fields = filter(lambda field: getattr(old_instance,field,None)!=getattr(new_instance,field,None), fields)

Список diff_fields на этом этапе должен содержать только first_name .

0 голосов
/ 18 июня 2020

update_or_create (defaults = None, ** kwargs )

Метод update_or_create пытается получить объект из базы данных на основе заданных kwargs. Если совпадение найдено, обновляет поля, переданные в словаре по умолчанию.

Запросу безразлично, изменились ли обновленные поля или нет, все поля в "default" обновляются.

Возвращает кортеж из (object, created), где object - это созданный или обновленный объект, а created - логическое значение, указывающее, был ли создан новый объект.

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#update -или-создать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...