Django高效批量创建,具有唯一约束
我搜索了这个,似乎没有真正好的解决方案(大多数答案都是多年前的)。对于批量创建需要唯一的对象,是否有新的好解决方案 好的,我有一个包含1000个dict和dict['keyword']的唯一约束的列表。到目前为止,我一直是这样做的: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
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
应该可以。在您真正遇到性能问题之前,我不会过早地担心性能问题