Django - 对整个QuerySet执行“向后”的ForeignKey关系

时间:2012-11-22 07:49:32

标签: python django postgresql django-queryset

是否可以向后追溯整个querySet的ForeignKey关系?

我的意思是这样的:

x = table1.objects.select_related().filter(name='foo')
x.table2.all()

当table1将ForeignKey用于table2时。

https://docs.djangoproject.com/en/1.2/topics/db/queries/#following-relationships-backward 我可以看到它只适用于get()而不是filter()

由于

3 个答案:

答案 0 :(得分:6)

您基本上希望从您开始使用的数据中获取不同类型的QuerySet

class Kid(models.Model):
    mom = models.ForeignKey('Mom')
    name = models.CharField…

class Mom(models.Model):
    name = models.CharField…

假设你想让所有妈妈都有一个名为Johnny的儿子。

Mom.objects.filter(kid__name='Johnny')

假设您希望得到所有Lucy的孩子。

Kid.objects.filter(mom__name='Lucy')

答案 1 :(得分:1)

你应该可以使用类似的东西:

for y in x:
y.table2.all()

但是,在使用查询找到它们之后,您还可以使用get()来获取唯一值的列表(除非您指定了其他值,这将是id

所以,

x = table1.objects.select_related().filter(name='foo')
for y in x:
   z=table1.objects.select_related().get(y.id)
   z.table2.all()

也应该有效。

答案 2 :(得分:1)

您还可以使用values()来获取外键引用的特定值。使用values,数据库上的选择查询将减少为仅获取这些值,并且将完成相应的连接。

重新使用Krzysztof Szularz的例子:

jonny_moms = Kid.objects.filter(name='Jonny').values('mom__id', 'mom__name').distinct()

这将使用Kid QueryManager返回Mom属性字典。