django的批量创建忽略重复[重复]

问题描述 投票:17回答:2

这个问题已经在这里有一个答案:

我想批量插入到一个MySQL数据库的一个非常大的数据集,并会喜欢使用Django的bulk_create而忽略重复的错误。

样品型号:

class MyModel(models.Model):
    my_id=models.IntegerField(primary_key=True)
    start_time = models.DateTimeField()
    duration = models.IntegerField()
    ......
    description = models.CharField(max_length=250)

到目前为止,我有以下代码(一般为我所有的车型,我传递一个Model_instance()和[bulk_create对象列表):

def insert_many(model, my_objects):
    # list of ids where pk is unique
    in_db_ids = model.__class__.objects.values_list(model.__class__._meta.pk.name)
    if not in_db_ids:
        # nothing exists, save time and bulk_create
        model.__class__.objects.bulk_create(my_objects)
    else:
        in_db_ids_list = [elem[0] for elem in in_db_ids]

        to_insert=[]
        for elem in my_objects:
            if not elem.pk in in_db_ids_list:
                to_insert.append(elem)
        if to_insert:
            model.__class__.objects.bulk_create(to_insert)

是否有以避免重复这样的Django的一种方式?模仿MySQL的insert ignore将是巨大的。如果我只是使用bulk_create(非常快),我得到一个错误,如果有一个主键重复和插入停止。

python mysql django bulkinsert bulk
2个回答
6
投票

此功能会做到这一点。 注意:如果你有独特的pk并没有别的unique这只会工作。

def insert_many(model, my_objects):
    # list of ids where pk is unique
    in_db_ids = model.__class__.objects.values_list(model.__class__._meta.pk.name)
    if not in_db_ids:
        # nothing exists, save time and bulk_create
        model.__class__.objects.bulk_create(my_objects)
    else:
        in_db_ids_list = [elem[0] for elem in in_db_ids]

        to_insert = []
        for elem in my_objects:
            if elem.pk not in in_db_ids_list and elem.pk not in to_insert:
                to_insert.append(elem)
        if to_insert:
            model.__class__.objects.bulk_create(to_insert)

如何使用insert_many(MyModel(), list_of_myModels_defined_but_not_saved)


5
投票

所述ignore_conflicts参数加入到bulk_create(Django 2.2

你也可以找到它在https://github.com/django/django/search?q=ignore_conflicts&unscoped_q=ignore_conflicts

© www.soinside.com 2019 - 2024. All rights reserved.