我在Django中有以下设置
class Class1(Model):
search_field = IntegerField()
field2 = ForeignKey(Class2)
class Class2(Model):
field3 = ForeignKey(Class3)
class Class3(Model):
#lots of useful stuff...
我正在Class1
进行查询,目的是找回Class3
的实例,但是Class1
和Class2
有很多信息我不知道我想加载,所以我想使用values
(或者让我更有效地做到这一点的东西)。我喜欢
q = Class1.objects.filter(search_field=search_criteria).values('field2__field3').latest()
但是当这个回来时,我得到一个字典,看起来像:
{'field2__field3': ID}
ID
是Class3
实例的关键字。有没有办法直接从values
(或其他一些查询实用程序)获取类的实例?
答案 0 :(得分:3)
Django查询的一个简单规则是始终查询要返回的内容。因此,如果您想要Class3
,请使用该开始查询。
Class3.objects.filter(class2__class1__search_field=search_criterion).latest()
答案 1 :(得分:3)
将您的代码重写为:
q = Class3.objects.filter(class2__class1__search_field=search_criteria)
即。直接询问您真正想要的对象,并使用Class3中的反向关系返回Class2和Class1作为过滤条件的一部分。
在您正在使用的related_name
上设置related_query_name
或ForeignKey
可能会有所帮助 - 如果设置,这些是在filter()参数中使用的名称。如果未设置,则默认为类名。