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.
回答你的问题,不,这是不可能的,至少对于一个外键,可能有一些hack对于多对多关系,因为Django似乎使用了一些内部描述符。
我建议你不要设置related_name="+",因为你想在这里使用反向关系。你说"这是因为多个应用程序之间的关注点分离">但这没有多大意义。我们不应该为各种其他模型设置用户模型的外键,并且仍然使用相关的名称吗?是否出现了关注点分离点(用户模型在单独的应用程序中)?

try

parent = Parent.objects.get(id=pk)
parent.child_set.all()

我不知道related_name = '+'是否可以防止这种情况,但如果您从不定义related_name,则绝对可以使用此方法。

相关内容

  • 没有找到相关文章

最新更新