首页 > 解决方案 > 当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)对象,因为它在参数列表中获取查询集?

标签: djangodjango-modelsdjango-orm

解决方案


稍微看了一下代码,发现了这一

rel_obj_descriptor = getattr(instance.__class__, through_attr, None)

这里instance是模型实例,through_attr是要获取的相关实例的字段名。这一行基本上试图获取一个相关的描述符来执行预取查询。在您的情况下rel_obj_descriptor将包含None.
要回答您的问题,不,至少对于外键来说是不可能的,多对多关系可能存在一些黑客攻击,因为 Django 似乎为它们使用了一些内部描述符。
我建议你不要设置related_name="+",因为你想在这里使用反向关系。你说“这是因为多个应用程序之间的关注点分离”但这没有多大意义。我们不是为其他各种模型设置了用户模型的外键并且仍然使用相关名称吗?是否存在关注点分离点(用户模型在单独的应用程序中)?


推荐阅读