django - 当related_name="+" 时预取查询集
问题描述
是否可以在没有相关名称 ( related_name="+"
) 的情况下预取目标实例上的对象?当然,我知道相关名称不是问题,但我不确定没有它是否可能。
这是示例代码:
from django.db import models
class Parent(models.Model):
name = models.CharField(max_length=50)
class Child(models.Model):
parent = models.ForeignKey(to=Parent, related_name="+", on_delete=models.CASCADE)
name = models.CharField(max_length=50)
Parent.objects.all().prefetch_related('child_set')
也许可以使用该Prefetch(lookup, queryset=None, to_attr=None)
对象,因为它在参数列表中获取查询集?
解决方案
稍微看了一下代码,发现了这一行:
rel_obj_descriptor = getattr(instance.__class__, through_attr, None)
这里instance
是模型实例,through_attr
是要获取的相关实例的字段名。这一行基本上试图获取一个相关的描述符来执行预取查询。在您的情况下rel_obj_descriptor
将包含None
.
要回答您的问题,不,至少对于外键来说是不可能的,多对多关系可能存在一些黑客攻击,因为 Django 似乎为它们使用了一些内部描述符。
我建议你不要设置related_name="+"
,因为你想在这里使用反向关系。你说“这是因为多个应用程序之间的关注点分离”但这没有多大意义。我们不是为其他各种模型设置了用户模型的外键并且仍然使用相关名称吗?是否存在关注点分离点(用户模型在单独的应用程序中)?
推荐阅读
- javascript - 如何检查系统上是否执行了 Javascript?
- sql - 如何在 Redshift Query 中禁用使用缓存结果?
- django - 如何停止 django postgresql 时间戳转换
- node.js - AWS Lambda NodeJS:使用可选过滤器属性进行扫描
- python-3.x - 两种分类代码中的预测函数都有错误
- reactjs - 在反应中获取下拉列表的值
- angular - router.navigate 测试 TypeError:无法读取未定义的属性“根”
- python - 从python列表中的名称(字符串)访问对象属性
- python - 为不同的 C++ 运行时编译 python 扩展
- r - 如何将值从一个数据帧传输到另一个数据帧?