как построить запрос orm , в котором говорится, что если модель не существует (объект), добавьте, но если она существует, затем измените измененные поля?

#python #django

Вопрос:

Я новичок в среде django , и я хотел бы знать, как построить следующий запрос, в котором я могу выполнить операцию вставки, когда объект не существует, но обновить измененные поля, если есть объект со следующим идентификатором

 from demo.models import Person
update_values = {"name": "Alice", "age": 12, "is_manager":False}
new_values = {"name": "Bob", "age": 25, "is_manager":True}
obj, created = Person.objects.update_or_create(identifier='id',
                                               defaults=update_values)
if created:
    print(f"created {obj}")
else:
    print(f"updated {obj}")
 

записка:

Я хочу сделать это с помощью одного метода update_or_create, а не с помощью двух get_or_create update_or_create

Ответ №1:

Я в замешательстве. Похоже, вы делаете это правильно, исходя из предположения, что идентификатор=»идентификатор» — это то, на чем вы фильтруете. Ваш код переводится obj = Person.objects.get(identifier="id"); [setattr(obj, k, v) for k,v in defaults.items()]; obj.save() так, а затем, если его не существует, он вставляет все эти параметры и значения по умолчанию. Другими словами, я думаю, что вы identifier="id" можете ошибаться. Я думаю,вы имели id=a primary key value в виду 1,2,3 и т. Д.

Подробное и действительно лучшее объяснение из документов Django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#update-or-create

Просто обратите внимание, что независимо от того, что вы делаете, требуется два запроса.