Django:查找多对多关系中的所有值,其中相关集合的所有元素都符合特定条件

Django: Find all values in a ManyToMany relationship where all elements of the related set match certain criteria

我在多对多关系中有两个模型。我想获取第一个模型的子集,每个 相关模型都符合特定条件。

场景:这是一个协作词典。一个词可能有 0 个或多个定义。定义可能处于多种状态:"complete"、"in progress" 或 "abandoned"。我有兴趣找到所有没有定义或 只有 有 "abandoned" 定义的词。

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)

所以我有四个词:

我想编写一个查询,它将 return (bacon, lobster)(无特定顺序)。

我可以将查询写入 return lobster:

Word.objects.annotate(Count("definitions")).filter(definitions__count=0)

我可以确定哪些定义被放弃了:

Definition.objects.filter(status=DefinitionState.ABANDONED)

但我不知道如何查询定义全部被放弃的词。

非常感谢

Words.objects.exclude(definitions__status__in=[COMPLETE, IN_PROGRESS])