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

  • Post category:Python

create_or_update()是Django ORM提供的一个非常有用的方法,它可以在一次调用中完成创建或更新记录的操作。在使用中,我们可以传递一个字典作为参数,该字典包含要创建或更新的字段和值。 在下面的示例中,我们将看到如何使用create_or_update()函数以及传递哪些参数来创建或更新记录。

1.函数作用

create_or_update()函数的作用相当于在数据库中进行查询操作,如果查询结果存在,则更新该记录,否则创建一条新记录。 这个函数可以简化常见的数据库操作,而无需在代码中手动判断记录。

2.函数使用方法

函数原型如下:

Manager.create_or_update(defaults=None, **kwargs)
  • defaults参数:用于指定要在记录不存在时创建的默认值。
  • **kwargs参数:用于指定要更新或创建的字段和值的字典。

下面是具体步骤和示例说明:

第一步:导入必要的模块和类

from django.db import models
from django.db.models import Q

第二步:创建模型

这里我们以一个Product模型为例,模型定义如下:

class Product(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(decimal_places=2, max_digits=10)
    description = models.CharField(max_length=1024)
    in_stock = models.BooleanField(default=False)

第三步:准备数据

假设我们有一些数据需要在数据库中创建或更新,我们可以准备一个字典来表示要创建或更新的一行数据。

data = {
    'name': 'Product 1',
    'price': 100.00,
    'description': 'Description for product 1',
    'in_stock': True
}

第四步:在代码中使用create_or_update()函数

我们可以使用objects管理器从模型中获取一个查询集,然后在查询集上调用create_or_update()函数来创建或更新我们的行数据。

result, created = Product.objects.create_or_update(
    defaults=data,
    name='Product 1',
    price=100.00
)

通过上面的代码,我们将会在Product模型中创建或更新一行记录。如果记录已存在,那么将会更新记录。否则,将会创建新的一行记录。函数执行结束后,create_or_update()函数会返回两个参数:

  • result:返回已创建或更新的记录的对象。
  • created:一个布尔值,表示是否已创建了新记录。

如果在数据库中找到了与查询参数匹配的一行记录,则result将是已更新的行,created将是False;否则,将会创建一行新记录,result将是新记录的实例,created将是True

第五步:完整示例1

from django.db import models
from django.db.models import Q

class Product(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(decimal_places=2, max_digits=10)
    description = models.CharField(max_length=1024)
    in_stock = models.BooleanField(default=False)

data = {
    'name': 'Product 1',
    'price': 100.00,
    'description': 'Description for product 1',
    'in_stock': True
}

result, created = Product.objects.create_or_update(
    defaults=data,
    name='Product 1',
    price=100.00
)

print('Product created' if created else 'Product updated')
print('Product name: ', result.name)
print('Product ID: ', result.id)

在上面的例子中,我们创建了一个Product模型,并定义了一个data字典来表示要创建或更新的一行数据。我们通过在defaults参数中提供这个字典来调用create_or_update()函数来创建或更新记录。在这个例子中,我们使用相同的参数值来查询已经存在的记录,因此created的值为False,函数执行的结果为更新记录。

第六步:完整示例2

现在假设我们要在Product模型中创建一个新的记录,我们可以通过提供一个新的字典来调用create_or_update()函数来完成创建记录的操作。

from django.db import models
from django.db.models import Q

class Product(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(decimal_places=2, max_digits=10)
    description = models.CharField(max_length=1024)
    in_stock = models.BooleanField(default=False)

data = {
    'name': 'Product 2',
    'price': 200.00,
    'description': 'Description for product 2',
    'in_stock': True
}

result, created = Product.objects.create_or_update(
    defaults=data,
    name='Product 2',   # 参数匹配不到任何数据,需要创建一条新的记录
    price=250.00
)

print('Product created' if created else 'Product updated')
print('Product name: ', result.name)
print('Product ID: ', result.id)

在上面的例子中,我们使用不同的价格值来调用create_or_update(),因此无法查找到现有记录,因此created将返回True,创建一条新的记录,并将其数据插入到数据库表中。

3.总结

在本文中,我们详细讲解了Django ORM中的create_or_update()函数,包括函数的作用、使用方法和示例说明。希望本文能够帮助读者更好地了解create_or_update() 函数的使用方式,可以更高效的完成开发任务。