2016-06-22 3 views
0

Итак, я использую API-интерфейс Django update_or_create для создания моих данных формы. Он отлично работает ... но, после его создания, мне нужно проверить, какие профили были фактически обновлены или были созданы в первый раз?Django API «update_or_create»: как фильтровать объекты по их созданию или обновлению?

Просто пример:

for people in peoples: 
     people, updated = People.objects.update_or_create(
      id=people.person_id, 
      defaults={ 
       'first_name': people.first_name, 
      } 
     ) 

Фильтрация QuerySet:

people = People.objects.filter(
     id__in=whatever, 
    ) 

Но теперь, я пытаюсь фильтровать QuerySet по созданы или обновлены ... но не вижу API для этого (например, Фитлер сортов)

Итак, я хотел бы сделать что-то вроде:

updated = Person.objects.filter(updated=True, created_for_first_time=False) 

and then I can write something like 

if updated: 
    do this 
else: 
    do this 

В принципе, я просто хочу проверить, был ли профиль обновлен или создан в первый раз.

ответ

2

Как показал в своем вопросе, метод update_or_create возвращает кортеж (obj, created), где obj в объекте, и created является логическим показывает, был ли создан новый объект.

Вы можете проверить значение логического поля, и создать список для хранения идентификаторов вновь созданных объектов

new_objects = [] 
for people in peoples: 
    obj, created = People.objects.update_or_create(...) 
    if created: 
     new_objects.append(obj.id) 

Вы можете фильтровать с помощью этого списка:

new_people = People.objects.filter(id__in=new_objects) 
existing_people = People.objects.exclude(id__in=new_objects) 
2

Когда вы звоните update_or_create:

person, created = People.objects.update_or_create(...) 

created возвращение значение будет True, если запись была только что создана, или False, если это была существующая запись, которая была обновлена. Если вам нужно действовать по этой части информации, лучше всего делать это прямо здесь, пока у вас есть к ней доступ.

Если вам нужно сделать это позже, единственный способ, которым я могу думать, - создать схему, которая ее поддерживает, то есть поля create_date и last_modify_date, и если эти два поля равны, вы знаете, что запись не была изменен с момента его создания.

Смежные вопросы