如何检查唯一性 bulk_create
How to check unique bulk_create
在Django中有一个方法get_or_create保证对象的唯一性。但是当添加很多记录时,处理 1000 条会花费很多时间(因为创建对象需要 1000 条请求)。我知道 bulk_create,但它不检查模型输入属性的唯一性。如何加快向数据库添加唯一对象的速度?如果可能,在 1 个请求中。
示例模型:
models.py
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
admin.py
# Create only one element (What I want to get)
_, created = Person.objects.get_or_create(first_name='Leon', last_name='Mariano')
_, created = Person.objects.get_or_create(first_name='Leon', last_name='Mariano')
# Create 2 objects with different ID
Person.objects.bulk_create(Person(first_name='Leon', last_name='Mariano'),
Person(first_name='Leon', last_name='Mariano'))
感谢 Ivan 的帮助。解决方案是:
models.py
from django.db.models import UniqueConstraint
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
constraints = [
UniqueConstraint(fields=['first_name', 'last_name'], name='unique person')
]
admin.py
Person.objects.bulk_create((
Person(first_name='fname', last_name='lname'),
Person(first_name='fname', last_name='lname'),
Person(first_name='fname2', last_name='lname2'),
), ignore_conflicts= True)
在Django中有一个方法get_or_create保证对象的唯一性。但是当添加很多记录时,处理 1000 条会花费很多时间(因为创建对象需要 1000 条请求)。我知道 bulk_create,但它不检查模型输入属性的唯一性。如何加快向数据库添加唯一对象的速度?如果可能,在 1 个请求中。
示例模型:
models.py
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
admin.py
# Create only one element (What I want to get)
_, created = Person.objects.get_or_create(first_name='Leon', last_name='Mariano')
_, created = Person.objects.get_or_create(first_name='Leon', last_name='Mariano')
# Create 2 objects with different ID
Person.objects.bulk_create(Person(first_name='Leon', last_name='Mariano'),
Person(first_name='Leon', last_name='Mariano'))
感谢 Ivan 的帮助。解决方案是:
models.py
from django.db.models import UniqueConstraint
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class Meta:
constraints = [
UniqueConstraint(fields=['first_name', 'last_name'], name='unique person')
]
admin.py
Person.objects.bulk_create((
Person(first_name='fname', last_name='lname'),
Person(first_name='fname', last_name='lname'),
Person(first_name='fname2', last_name='lname2'),
), ignore_conflicts= True)