【问题标题】:Many to many query: find words that have only checked phrases多对多查询:查找仅包含检查短语的单词
【发布时间】:2018-08-08 16:54:44
【问题描述】:

我有word 模型和phrase 模型

class Word(models.Model): 
        checked = models.BooleanField(default=False)

class Phrase(models.Model):
    words = models.ManyToManyField(Word, null=True,related_name = "phrases")

Word 模型具有属性checked 以及与phrase 的多对多连接

我需要执行一个对我来说很困难的查询:

  • 我们正在考虑这个短语is checked,如果它至少有一个 checked字。

  • 我如何找到所有选中的短语和没有unchecked短语的单词?

现在我正在使用循环遍历 db 中的所有单词,但这不是很有效,所以我正在寻找更有效的方法来做到这一点。

【问题讨论】:

  • 没有Words 的Phrases 会怎样,反之亦然?
  • @WillemVanOnsem Phrase 总是至少有一个WordWord 总是至少有一个Phrase

标签: django python-3.x


【解决方案1】:

我们可以分两步完成:

non_checked_phrases=Phrase.objects.exclude(word__checked=True)
non_checked_words = Word.objects.exclude(phrases__in=non_checked_phrases)

首先,我们因此获得PhrasesQuerySet,其中没有检查任何相关单词。接下来我们获得一个QuerySet,其中我们排除了之前生成的QuerySet中所有具有相关短语的单词。

这将生成如下查询:

SELECT word.*
FROM word
WHERE NOT (word.id IN
    (SELECT pw1.`word_id`
     FROM phrase_word AS pw1
     WHERE pw1.phrase_id IN
         (SELECT p.`id`
          FROM `auth_group` AS p
          WHERE NOT (V0.`id` IN
              (SELECT pw2.`phrase_id`
               FROM phrase_word AS pw2
               INNER JOIN word AS w2 ON pw2.word_id = w2.id
               WHERE w2.is_active = True
             )
         ))
    )
)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2014-02-05
相关资源
最近更新 更多