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

  • Post category:Python

create_or_update()函数是Django ORM中提供的一个非常实用的方法,它可以用于在数据库中创建新的对象或者更新已有的对象。如果指定的对象在数据库中不存在,该方法会创建一个新的对象并保存到数据库中;如果指定的对象在数据库中已经存在,则该方法会直接更新该对象的数据,并保存到数据库中。

该方法的核心思想是:先尝试从数据库中获取指定条件的对象,如果获取到了,则更新它的数据;如果没有获取到,则创建一个新的对象,并保存到数据库中。

下面是该函数的详细使用方法以及两个实例说明:

函数的定义:

Model.objects.update_or_create(defaults=None, **kwargs)

参数:

  • defaults: 字典类型,可以设置需要更新的字段和值,如果不指定则使用传入的参数 **kwargs
  • **kwargs: 关键字参数,用来指定查询条件及其它需要更新的字段。

返回值:

该函数会返回一个元组 (object, created),其中:

  • object: 表示更新或创建的对象。
  • created: 表示该对象是否是新创建的,如果是返回 True,否则返回 False

示例1:

假设我们有一个名为 Person 的模型类,它有以下属性:

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    address = models.CharField(max_length=200)

我们现在需要根据名字和地址创建新的对象,如果存在则更新年龄。我们可以这样使用 create_or_update() 方法:

person, created = Person.objects.update_or_create(
    name='Tom',
    address='New York',
    defaults={'age': 25}
)
  • 如果数据库中已经存在名字为 Tom,地址为 New York 的对象,那么更新该对象的年龄为 25,并返回更新后的对象 personcreated=False
  • 如果数据库中不存在这个对象,则创建新的对象,并保存到数据库中,并返回创建的对象 personcreated=True

示例2:

我们有一个名为 Product 的模型类,它有以下属性:

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)

我们需要根据产品名称更新价格,如果产品不存在则创建新的产品。我们可以这样使用 create_or_update() 方法:

product, created = Product.objects.update_or_create(
    name='iPhone',
    defaults={'price': 699.99}
)
  • 如果数据库中已经存在名字为 iPhone 的产品,那么更新该产品价格为 699.99,并返回更新后的产品 productcreated=False
  • 如果数据库中不存在 iPhone 这个产品,则创建新的产品,并保存到数据库中,并返回创建的产品 productcreated=True

以上就是 create_or_update() 函数的用法及两个示例说明。