Django“update_or_create”API:如何通过创建或更新过滤对象?
Posted
技术标签:
【中文标题】Django“update_or_create”API:如何通过创建或更新过滤对象?【英文标题】:Django "update_or_create" API: how to filter objects by created or updated? 【发布时间】: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
基本上,我只想检查个人资料是否是第一次更新或创建。
【问题讨论】:
【参考方案1】:当您拨打update_or_create
时:
person, created = People.objects.update_or_create(...)
如果记录是新创建的,created
返回值将是 True
,如果是更新的现有记录,则返回值将是 False
。如果您需要根据这些信息采取行动,最好在您可以访问的情况下在此处执行。
如果以后需要做,我能想到的唯一办法就是设计一个支持它的schema,即有create_date
和last_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)
【讨论】:
以上是关于Django“update_or_create”API:如何通过创建或更新过滤对象?的主要内容,如果未能解决你的问题,请参考以下文章
django单表操作中update_or_create不能更新多于一个数据的信息
django update_or_create 得到“重复键值违反唯一约束”
Django 2021年最新版教程17数据库操作 models 存在更新 不存在新建update_or_create
是否有用于使用 VTL 的 AWS Appsync 的 Model.objects.update_or_create()?