首页 > 解决方案 > Django 在创建期间将对象添加到相关管理器

问题描述

考虑一个简单的 ForeignKey 关系:

class A(Model):
    pass
class B(Model):
    a = ForeignKey(A)

我有一个 API 视图,它根据外部数据(未从用户传递的数据)创建一个 A 和一组 B,然后序列化创建的对象并返回序列化数据。我的对象创建代码如下所示:

a = A()
a.b_set.bulk_create(B(a=a) for b in [...])

我的问题是这不会将 B 对象添加到 a 的 b_set,所以如果我要运行

print(a.b_set.all())

之后,它将重新查询数据库以获取 b_set。不过这是不必要的,因为我刚刚创建了 a 的整个 b_set。我正在使用一系列嵌套对象来执行此操作,因此会导致很多不必要的查询。我目前的解决方法是,在创建后,运行如下查询

A.objects.prefetch_related('b_set').get(a=a.id)

然后是获取对象的序列化程序。这将序列化限制为一个不必要的查询,但我也想消除那个查询。在我看来,应该有一种方法可以在 a 上缓存创建的 B 对象,并消除在序列化过程中再次访问 DB 的任何需要。

标签: djangodjango-rest-framework

解决方案


我相信你需要先执行a.save()才可以bulk_create。这是我使用您描述的两个模型的结果:

a = A()
a.save()
a.b_set.bulk_create([B(a=a), B(a=a), B(a=a)])    
a.b_set.count()
>>> 3

推荐阅读