我在ManyToMany关系中有两个模型。我想获得第一个模型的子集,该模型的每个 相关模型都符合特定条件。
方案:这是用于协作字典的。一个单词可能有0个或更多的定义。定义可以处于多种状态:“完成”,“进行中”或“已放弃”。我有兴趣查找所有没有定义或仅 的单词都具有“放弃”的定义。
class DefinitionState(Enum):
COMPLETE = 0
IN_PROGRESS = 1
ABANDONED = 2
class Definition(models.Model):
text = models.TextField()
status = models.IntegerField()
class Word(models.Model):
text = models.CharField(length=60)
definitions = models.ManyToManyField(Definition, related="words")
spam = Word.objects.create(text="spam")
eggs = Word.objects.create(text="eggs")
bacon = Word.objects.create(text="bacon")
lobster = Word.objects.create(text="lobster")
spam_d1 = Definition.objects.create(
text="Processed meat",
status=DefinitionState.COMPLETE
)
spam_d2 = Definition.objects.create(
text="Unwanted email",
status=DefinitionState.ABANDONED
)
spam.definitions.add(spam_d1)
spam.definitions.add(spam_d2)
eggs_d = Definition.objects.create(
text="Laid by chickens",
status=DefinitionState.COMPLETE
)
eggs.definitions.add(eggs_d)
bacon_d = Definition.objects.create(
text="Part of a pig",
status=DefinitionState.ABANDONED
)
bacon.definitions.add(bacon_d)
所以我有四个词:
spam
,其中有一个COMPLETE定义和一个ABANDONED定义; eggs
,其中有一个COMPLETE定义; bacon
,其中有一个ABANDONED定义; lobster
,没有定义。我想编写一个查询,该查询将返回(bacon, lobster)
(无特定顺序)。
我可以编写查询以返回lobster
:
Word.objects.annotate(Count("definitions")).filter(definitions__count=0)
我可以确定放弃了哪些定义:
Definition.objects.filter(status=DefinitionState.ABANDONED)
但是我不知道该如何请求所有定义都被放弃的单词。
非常感谢
答案 0 :(得分:3)
Words.objects.exclude(definitions__status__in=[COMPLETE, IN_PROGRESS])