如何检查唯一的 bulk_create

Posted

技术标签:

【中文标题】如何检查唯一的 bulk_create【英文标题】:How to check unique bulk_create 【发布时间】:2021-12-04 14:38:27 【问题描述】:

在 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'))

【问题讨论】:

您想对所有对象强制执行此唯一性,还是仅对这一插入强制执行此唯一性?如果您在两个字段上添加唯一约束,则 bulk_insert 不会创建重复项 【参考方案1】:

感谢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)

【讨论】:

以上是关于如何检查唯一的 bulk_create的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Firebase 数据库中的唯一用户名(swift)

我们如何检查唯一 ID 的任意 2 个间隔是不是重叠?

如何检查数组字段是不是包含唯一值或 MongoDB 中的另一个数组?

如何检查多个文件夹并删除具有唯一文件名的任何文件?

如何检查 Firebase 数据库中用户输入数据的唯一性?迅速

当所有检索值在laravel中具有相同的会话键时,如何检查会话数组是不是具有唯一的ID