首页 > 解决方案 > 通过 Django M2M 字段查询

问题描述

我有这些模型,通过 WordCloudSouce 从 WordCloud 到 Source 的 M2M 字段

class Source(Model):
    source_id = models.AutoField(primary_key=True)
    source_name = models.CharField(max_length=64, default="foobar")

class WordCloud(Model):
    cloud_id = models.AutoField(primary_key=True)
    cloud_name = models.CharField(max_length=125, unique=True)
    sources = models.ManyToManyField(Source, related_name="sources", through='WordCloudSource')

class WordCloudSource(Model):
    wordcloud_sources_id = models.AutoField(primary_key=True)
    wordcloud = models.ForeignKey(WordCloud, on_delete=models.CASCADE)
    source = models.ForeignKey(Source, on_delete=models.CASCADE)

我想构造一个查询来查找wordcloud具有cloud_name='frank'sources作为字符串列表的 a (例如['a', 'b']or ['a'])。

我正在寻找类似的东西:

WordCloud.objects.filter(cloud_name='frank', sources=['a', 'b'])

但我不清楚如何编写一个遍历sourcesM2M 字段的查询以获取wordcloud. 我已经阅读了 3.0 的 Django 文档,但对我来说仍然没有任何意义。

我想要的行为如下。假设我们有以下内容:

查询filter(name='frank', sources=['aa'])应该只匹配w1.

查询filter(name='frank', sources=['aa', 'bb'])应该只匹配w2

我做到了

WordCloud.objects.filter(cloud_name='frank', sources__source_name__in=['aa', 'bb'])

但这是不正确的,因为它返回以 and 命名frank的wordcloud sources=['aa']sources=['aa', 'bb']这不是我想要的。

谢谢!

标签: python-3.xdjangodjango-models

解决方案


推荐阅读