django - 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 的任何需要。
解决方案
我相信你需要先执行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
推荐阅读
- spring-boot - 将自定义 AuthenticationProvider 添加到 Spring Boot + oauth +oidc
- kubernetes - 如何引用 values.yaml 中的命名空间?
- c++ - 任何人都可以解释这个初始化代码吗?
- multithreading - 多线程 Julia 使用枚举迭代器显示错误
- dart - 最终变量是否有性能提升?
- javascript - 如何在 AdonisJS 中从 PHP 翻译这段代码?
- r - 使用月份(列)和句点(行)使数据框变宽
- python - 图像中颜色范围的百分比
- swift - 如何制作 NSSound 循环
- python - 有没有一种简单的方法可以从另一个 df 中的一个数据帧中搜索一个字符串并返回一个关联的值?