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)