是否可以在没有相关名称(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
.
回答你的问题,不,这是不可能的,至少对于一个外键,可能有一些hack对于多对多关系,因为Django似乎使用了一些内部描述符。
我建议你不要设置related_name="+"
,因为你想在这里使用反向关系。你说"这是因为多个应用程序之间的关注点分离">但这没有多大意义。我们不应该为各种其他模型设置用户模型的外键,并且仍然使用相关的名称吗?是否出现了关注点分离点(用户模型在单独的应用程序中)?
try
parent = Parent.objects.get(id=pk)
parent.child_set.all()
我不知道related_name = '+'是否可以防止这种情况,但如果您从不定义related_name,则绝对可以使用此方法。