【问题标题】:Django "update_or_create" API: how to filter objects by created or updated?Django“update_or_create”API:如何通过创建或更新过滤对象?
【发布时间】:2016-10-24 16:06:03
【问题描述】:

所以,我正在使用 Django update_or_create API 来构建我的表单数据。它工作正常...但是,一旦构建,我需要一种方法来检查哪些配置文件实际更新了,或者它们是否是第一次创建?

只是一个例子:

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

过滤查询集:

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

但是,现在,我正在尝试通过创建或更新来过滤查询集...但没有看到用于该查询集的 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

基本上,我只想检查个人资料是否是第一次更新或创建。

【问题讨论】:

    标签: python django django-queryset django-filter


    【解决方案1】:

    当您拨打update_or_create时:

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

    如果记录是新创建的,created 返回值将是 True,如果是更新的现有记录,则返回值将是 False。如果您需要根据这些信息采取行动,最好在您可以访问的情况下在此处执行。

    如果以后需要做,我能想到的唯一办法就是设计一个支持它的schema,即有create_datelast_modify_date字段,如果这两个字段相等,就知道记录了自创建以来未修改过。

    【讨论】:

      【解决方案2】:

      正如您在问题中显示的那样,update_or_create 方法返回一个元组 (obj, created),其中 obj 在对象中,created 是一个布尔值,显示是否创建了新对象。

      您可以检查布尔字段的值,并创建一个列表来存储新创建对象的 ID

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-21
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        相关资源
        最近更新 更多