Django批量创建对象时多对多关系未生成的问题排查
Django批量创建对象时多对多关系未保存的原因及解决办法
Django的bulk_create方法为了追求批量操作的性能,不会自动处理任何关联关系——哪怕你是通过entry_set这种反向关联管理器调用它,也只会创建Entry对象本身,不会自动把这些对象和关联的b对象绑定多对多关系。而单个的create方法会在创建对象后自动触发关联关系的保存逻辑,所以能正常生成多对多记录。
解决办法分两种场景:
- 如果是要把批量创建的所有Entry对象都关联到同一个b对象,直接在创建完成后调用
add方法:# 先批量创建Entry对象 entries = Entry.objects.bulk_create(entry_objects) # 手动建立多对多关联 b.entry_set.add(*entries) - 如果是不同的Entry要关联不同的Blog对象,或者数据量极大需要更高效率,可以直接操作多对多的中间表(Django自动生成或你自定义的through模型),批量创建关联记录:
假设中间表模型是BlogEntry,字段为blog和entry:# 构造中间表对象列表 relation_objects = [ BlogEntry(blog=对应blog对象, entry=entry_obj) for entry_obj, 对应blog对象 in zip(entries, blog_list) ] # 批量创建关联 BlogEntry.objects.bulk_create(relation_objects)
内容的提问来源于stack exchange,提问作者akash deep
相关产品推荐
相关产品推荐

