Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django高效批量创建,具有唯一约束_Django - Fatal编程技术网

Django高效批量创建,具有唯一约束

Django高效批量创建,具有唯一约束,django,Django,我搜索了这个,似乎没有真正好的解决方案(大多数答案都是多年前的)。对于批量创建需要唯一的对象,是否有新的好解决方案 好的,我有一个包含1000个dict和dict['keyword']的唯一约束的列表。到目前为止,我一直是这样做的: self.get_existing_KeyO = \ list(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data]).all()) 然后我创建那个些数据库中还并没有的。我使用的是dja

我搜索了这个,似乎没有真正好的解决方案(大多数答案都是多年前的)。对于批量创建需要唯一的对象,是否有新的好解决方案

好的,我有一个包含1000个dict和dict['keyword']的唯一约束的列表。到目前为止,我一直是这样做的:

self.get_existing_KeyO = \
list(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data]).all())
然后我创建那个些数据库中还并没有的。我使用的是django 1.10(因为我需要创建对象的ID)


我使用芹菜(多线程)执行此操作,因此存在冲突(两个线程同时添加到数据库)。get_或_create能更高效吗?我有点担心它会使数据库崩溃,因为有时我会同时添加5-10个列表,这将导致大约10000个查询。

最佳方法将取决于冲突的可能性。如果它们很少,那么使用
bulk\u create
的乐观并发方法应该可以很好地工作。比如:

while True:
    existing = set(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data])
                               .values_list("keyword", flat=True))

    try:
        KeyO.objects.bulk_create(KeyO(...) for x in self.data 
                                 if x['keyword'] not in existing)
    except IntegrityError:
         continue
    else:
         break
如果冲突很常见,那么在循环中使用
get\u或\u create
应该可以。在您真正遇到性能问题之前,我不会过早地担心性能问题