2016-06-08 69 views
1

我搜索了这个,似乎没有真正好的解决方案(大多数答案是岁)。是否有任何新的有利于bulk_creating对象的良好解决方案需要是唯一的?Django高效bulk_create与独特的约束

好的,所以我列出了包含约1000个字典和唯一约束字典['关键字']。到目前为止,我一直这样做:

self.get_existing_KeyO = \ 
list(KeyO.objects.filter(keyword__in=[x['keyword'] for x in self.data]).all()) 

然后我bulk_create那些还没有在数据库中。我正在使用django 1.10(因为我需要ID的创建对象)

我这样做与芹菜(多线程),所以有冲突(两个线程同时添加到数据库)。可以get_or_create更高效吗?我有点害怕它会使数据库崩溃,因为有时候我会同时添加5-10个列表,这会导致大约10 000个查询。

回答

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在循环中应罚款。我不会过早担心性能问题,直到你真正遇到它们。