update_or_create()
是 Django 中一个非常有用的模型方法。 其作用是在一个模型中尝试更新已存在的记录,如果不存在记录则创建一个新纪录。 如果你想要避免手动编写 try...except
代码的话,这个方法可能非常适合你的需要。
下面是这个方法的使用语法:
Model.objects.update_or_create(defaults=None, **kwargs)
其中:
defaults
代表若创建新记录时,给新纪录的字段里提供的默认值。**kwargs
则代表筛选已有记录的条件。
实战1:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Book
def add_or_update_book(request):
book, created = Book.objects.update_or_create(
title='The Old Man and the Sea',
defaults={'author': 'Ernest Hemingway', 'published_year': 1952}
)
if created:
message = 'Book added successfully!'
else:
message = 'Book updated successfully!'
return HttpResponse(message)
在示例中,我们先拿到了一个 Book
模型及其管理器对象 Book.objects
。 然后使用 update_or_create()
方法来更新或新增书籍记录。 其中,我们输入了书本《老人与海》的名字,并提供了该书本的作者和出版年份的默认值(如果记录不存在的话这些默认值将会起作用)。
如果找到了记录,则会更新记录,并且 created
的值为 False
,如果没有找到记录则会创建新的记录,并且 created
值为 True
。
实战2:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Book
def add_or_update_book(request, title, author, published_year):
book, created = Book.objects.update_or_create(
title=title,
defaults={'author': author, 'published_year': published_year}
)
if created:
message = 'Book added successfully!'
else:
message = 'Book updated successfully!'
return HttpResponse(message)
在示例中,我们可以使用动态的参数来进行更新或新增。不同的参数值将会影响到更新或新增后记录的结果。相对于第一个实战,第二个实战更加的灵活和自由。
总结:
update_or_create()
能够根据多种条件更新记录,并且以更加简明的形式去实现。这个函数的内部使用了多个 SQL 语句的优化操作,所以在效率上高于描述更为复杂的外部方法。使用这个函数,你可以更轻松地维护你的应用程序的数据内容。