Django查询了很多关系

时间:2018-06-18 13:05:44

标签: django django-queryset

我有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

我该怎么做?

2 个答案:

答案 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()

因此,我们在JOINwords表格中使用phrase_words,然后进行过滤,以使group_id的{​​{1}}为{{ 1}}。

Word可能很重要,因为如果 mutliple 177位于带有.distinct() 177的words中,那么group将重复多次次。

这适用于idPhrase主键的情况。如果您定义了另一个名为id的列,并且该列不是主键(这是非常罕见的),我们可以使用:

Group

请注意,我们在这里使用两个连续的下划线(id)而不是一个(Phrase.objects.filter( name='xxx', words__group__id=177 ).distinct())来查看“通过”外键。在这种情况下,这将导致数据库级别的额外__,因此效率会降低。