详解Django的 update_or_create() 函数:更新或创建对象

  • Post category:Python

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 语句的优化操作,所以在效率上高于描述更为复杂的外部方法。使用这个函数,你可以更轻松地维护你的应用程序的数据内容。