我有3个模型:组,单词,短语
正如你可以看到单词属于组,短语和单词之间有很多关系:
class Group(models.Model):
name = models.TextField()
class Word(models.Model):
group = models.ForeignKey(Group, on_delete=models.SET_NULL, null=True,
related_name = "words")
class Phrase(models.Model):
words = models.ManyToManyField(Word, null=True,related_name = "phrases")
name = models.TextField()
现在我需要找phrases
name ="xxx"
word
至少有一个group with group id = '177'
来自SELECT * from $1
我该怎么做?
答案 0 :(得分:2)
Phrase.objects.filter(name="xxx", words__group__id=177)
您可以过滤名称为“xxx”的所有词组,其中一个词组'group_id等于177。
答案 1 :(得分:1)
您可以使用同时过滤name
字段和words__group_id=177
:
Phrase.objects.filter(
name='xxx',
words__group_id=177
).distinct()
因此,我们在JOIN
和words
表格中使用phrase_words
,然后进行过滤,以使group_id
的{{1}}为{{ 1}}。
Word
可能很重要,因为如果 mutliple 177
位于带有.distinct()
177的words
中,那么group
将重复多次次。
这适用于id
是Phrase
的主键的情况。如果您定义了另一个名为id
的列,并且该列不是主键(这是非常罕见的),我们可以使用:
Group
请注意,我们在这里使用两个连续的下划线(id
)而不是一个(Phrase.objects.filter(
name='xxx',
words__group__id=177
).distinct()
)来查看“通过”外键。在这种情况下,这将导致数据库级别的额外__
,因此效率会降低。