Django 相关时预取queryset\u name="+&引用;

Django 相关时预取queryset\u name="+&引用;,django,django-models,django-orm,Django,Django Models,Django Orm,如果没有相关名称(related_name=“+”),是否可以预取目标实例上的对象?当然,我知道相关名称没有问题,但我不确定没有它是否可能 下面是示例代码: 来自django.db导入模型的 类父级(models.Model): name=models.CharField(最大长度=50) 类子(models.Model): parent=models.ForeignKey(to=parent,related_name=“+”,on_delete=models.CASCADE) name=mod

如果没有相关名称(
related_name=“+”
),是否可以预取目标实例上的对象?当然,我知道相关名称没有问题,但我不确定没有它是否可能

下面是示例代码:

来自django.db导入模型的

类父级(models.Model):
name=models.CharField(最大长度=50)
类子(models.Model):
parent=models.ForeignKey(to=parent,related_name=“+”,on_delete=models.CASCADE)
name=models.CharField(最大长度=50)
Parent.objects.all()
也许可以使用
预取(lookup,queryset=None,to_attr=None)
对象,因为它接受参数列表中的queryset?

试试看

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

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

仔细查看了代码,发现:

这里,
instance
是模型实例,
through\u attr
是要获取的相关实例的字段名。这一行主要尝试获取相关描述符来执行预取查询。在您的情况下,
rel\u obj\u描述符将包含
None

要回答您的问题不,至少外键是不可能的,因为Django似乎对多对多关系使用了一些内部描述符,因此可能存在一些黑客攻击。

我建议您不要设置
related\u name=“+”
,因为您想在这里使用向后关系。你说“这是因为多个应用之间的关注点分离”,但这没有多大意义。我们是否为各种其他模型的用户模型设置了外键,并且仍然使用相关名称?是否出现了问题分离点(用户模型在单独的应用程序中)?

您在这里遇到了什么样的问题?您是否尝试过并遇到错误,或者您正在问“如果”类似的问题?@Charnel问题是,相关名称用于查询集查找,因此当相关名称未设置时,它不能用于查询集查找,如
Parent.objects.filter(child\uuuuu[insert attribute]=…)
。同样的行为也适用于预取。如果您没有指定相关名称,您仍然可以使用
\u set
sufix,如
fieldname\u set
。我有
related\u name=“+”
它在问题名称和示例代码中。如果您仍然想访问向后的关系,
related\u name=“+”
有什么意义?是的,但是
related\u name=“+”
是必需的。您尝试过这个吗???
parent=parent.objects.get(id=pk)parent.child\u set.all()
请再次阅读问题和问题下面的讨论。
rel_obj_descriptor = getattr(instance.__class__, through_attr, None)