2

是否可以为整个查询集向后跟踪 ForeignKey 关系?

我的意思是这样的:

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

当 table1 hase ForeignKey to table2。

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

谢谢

4

3 回答 3

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')

假设您想要获取 any 的所有孩子Lucy

Kid.objects.filter(mom__name='Lucy')
于 2012-11-22T08:57:58.017 回答
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()

也应该工作。

于 2012-11-22T07:56:10.890 回答
1

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

要重用来自 Krzysztof Szularz 的示例:

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

这将使用 Kid QueryManager 返回一个妈妈属性的字典。

于 2014-10-27T16:39:08.160 回答