是否可以向后追溯整个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()
由于
答案 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属性字典。