在Django查询中使用values()来获取Model而不是ID

时间:2015-03-11 17:23:48

标签: python django

我在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的实例,但是Class1Class2有很多信息我不知道我想加载,所以我想使用values(或者让我更有效地做到这一点的东西)。我喜欢

q = Class1.objects.filter(search_field=search_criteria).values('field2__field3').latest()

但是当这个回来时,我得到一个字典,看起来像:

{'field2__field3': ID}

IDClass3实例的关键字。有没有办法直接从values(或其他一些查询实用程序)获取类的实例?

2 个答案:

答案 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_nameForeignKey可能会有所帮助 - 如果设置,这些是在filter()参数中使用的名称。如果未设置,则默认为类名。