让我们说为了简单起见,我有三个类:
class BigThing(models.Model):
title = models.CharField(max_length=48)
stufflists = models.ManyToManyField(StuffList)
class StuffList(models.Model):
title = models.CharField(max_length=48)
stuff = models.ManyToManyField(Stuff)
class Stuff(models.Model):
code = models.CharField(max_length=24)
title = models.CharField(max_length=48)
description = RedactorField(blank=True, null=True)
BigThing1包含List1和List3。
List1包含Item1,Item2,Item3。
List2包含Item1,Item2和Item4。
List3仅包含Item3。
我想返回属于BigThing1的所有项目,省略重复项,如下所示:
Item1, Item2, Item3
NOT: Item1, Item2, Item3, Item3
(and obviously not Item4, since that doesn't belong to either of the lists associated with BigThing1)
我觉得有一些涉及prefetch_related或select_related的东西,但我有点难过,因为我是Django / Postgres的新手。在过去,我会做一个JOIN查询,但是无论如何都要承认这些查询是一种黑客攻击,并且想知道这种查询的最佳实践。
答案 0 :(得分:1)
ManyToMany relationships can be followed backwards(特别是“支持反向m2m查询”的部分)
以下内容应该有效
Stuff.objects.filter(stufflist__bigthing=BigThing1).distinct()