/ / django update_or_create (), подивіться, що отримали оновлення - django, django-models, django-views

django update_or_create (), перегляньте оновлення - django, django-models, django-views

Мій додаток django використовує update_or_create() оновлювати купу записів. У деяких випадках оновлення дійсно мало в межах тонни записів, і було б добре знати що оновлено в цих записах. Чи можна знати, що отримали оновлення (тобто поля, значення яких змінено)? Якщо ні, чи є у когось ідеї обхідних шляхів для досягнення цього?

Це буде викликано з оболонки, тому в ідеалі було б непогано, коли вам буде запропоновано підтвердження перед тим, як значення є змінився в межах update_or_create(), але якщо ні, то знання того, що змінилося, також допоможе.

Оновити (більше контексту): Думав, що я дам більше контексту тут. Дані цього додатка Django оновлюються різними засобами (через користувачів, що надходять на веб-сайт, через сторінку адміністратора, через скрипти (запускаються з оболонки), які заповнюють дані з csv і т.д.). Наведене вище питання важливо в основному для сценаріїв оболонки, які оновлюють дані з csvs, отже, рішення на рівні бази даних / тригера / сигналу може бути не корисно тут (я думаю).

Відповіді:

1 для відповіді № 1

Це буде викликано з оболонки, тому в ідеалі було б добре запит на підтвердження безпосередньо перед зміною значення

На жаль, бази даних не працюють так. Це відповідальність програм, щоб забезпечити цю функціональність. І django не є додатком. Однак ви можете використовувати django для написання програми, яка надає цю функціональність.

Що стосується з'ясування того, чи був об'єкт оновлений або створений, це те, що повернення вартості дає вам. Кортеж, де другим значенням є прапор для оновлення або створення


0 для відповіді № 2

Саме це я і закінчив:

for row in reader:
school_obj0, created = Org.objects.get_or_create(school_id = row[0])

if (school_obj0.name != row[1]):
print (school_obj0.name, "==>", row[1])
confirmation = input("proceed? [y/n]: ")
if (confirmation == "y"):
school_obj1, created = Org.objects.update_or_create(
school_id = row[0], defaults={"name": row[1],})

Ми раді дізнатися про покращення цього підходу (див. Оновлення у запиті з більшим контекстом)