我搜索了这个并且似乎没有真正好的解决方案(大多数答案都是岁月)。对于需要唯一的bulk_creating对象,是否有任何新的良好解决方案?
好的,所以我在dict ['keyword']上有包含~1000个词组和唯一约束的列表。到目前为止,我一直在这样做:
self.get_existing_KeyO = \
list(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data]).all())
然后我批量创建那些尚未存在于数据库中的文件。我正在使用django 1.10(因为我需要创建对象的ID)
我使用celery(多线程)执行此操作,因此存在冲突(两个线程同时添加到数据库)。 get_or_create可以提高效率吗?我有点害怕它会崩溃DB,因为有时我会同时添加5-10个列表,这将导致~10 000个查询。
答案 0 :(得分:1)
最佳方法取决于碰撞的可能性。如果它们很少见,那么使用bulk_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_or_create
应该可以正常工作。在您真正遇到性能问题之前,我不会过早担心性能问题。