如何在 Django 中使用 through 过滤 ManytoManyField?

Posted

技术标签:

【中文标题】如何在 Django 中使用 through 过滤 ManytoManyField?【英文标题】:How to filter for a ManytoManyField with through in Django? 【发布时间】:2020-08-09 12:42:21 【问题描述】:

尝试过滤所有协议数据源及其在协议中的特定数据源。

尝试使用这个:ProtocolDataSource.objects.filter(protocol__data_sources=..., protocol__data_sources=...) 但显然这会出现错误。点是数据源的名称。

【问题讨论】:

您好,请同时附上您尝试的代码以及错误消息。这有助于快速解决您的问题。 【参考方案1】:

为了让你的related_query_name 更可预测,我建议在你的ManytoManyField 中添加参数related_query_name

class Protocol(BaseWithImmutableKey):

    name = models.CharField(
        max_length=200, unique=True, verbose_name='Protocol Name')

    # add related_query_name
    data_sources = models.ManyToManyField(
        DataSource, through='ProtocolDataSource', related_query_name='protocols')


# now you can reference reversely using protocols
DataSource.objects.filter(protocols__name=...)

您可以在这里阅读更多内容what is related_name and related_query_name in django?

【讨论】:

哦,好的,谢谢您的回复。相关查询使运行查询更容易。但是问题是,如果我要对 ProtocolDataSource 进行过滤,但对于 data_sources 对象,过滤器会是什么样子?甚至在协议中的用户对象上。仍然对通过部分以及它如何影响过滤器感到困惑。

以上是关于如何在 Django 中使用 through 过滤 ManytoManyField?的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤 SQL 结果在 has-many-through 关系中

django manytomany 字段使用 through 和 formwizard

如何使用 django rest framework 序列化一个 ManyToManyField 和一个 Through Model

Django Q过滤器否定不会产生预期的查询

通过 m2m 关系的直通表的值过滤 django 查询集

如何在 django 中使用过滤器