在 M2M 字段 Django 中过滤标签

Posted

技术标签:

【中文标题】在 M2M 字段 Django 中过滤标签【英文标题】:Filtering tags in M2M Field Django 【发布时间】:2022-01-20 22:27:33 【问题描述】:

所以我有我的模型

Class Category((models.Model)
    category = models.CharField()

class Group(models.Model)
    Title = models.CharField()
    category = models.ManyToManyField(Category, related_name= tags)

所以我希望能够过滤所有标签与当前视图中的组相似的组

在我的views.py中我试过了

group = Group.objects.get(id=pk)
groups = Group.objects.filter(category=group.category)

但这不起作用

【问题讨论】:

什么是“相似”标签?一个标签的共同点? group 的所有标签都应该在groups 的类别中,完全匹配(这些和这些类别)?还有什么? 好的,所以每个组都有机会选择已经存在的标签,但它们不限于一个标签,假设A组有以下标签Movie,Anime和Music,Group be有只有我希望能够检索组的音乐是因为它与组 A 具有相似的标签 关于类别有一个或多个组,一个组有一个或多个类别,数据库级别的m2m字段是一个单独的表检查文档以进行澄清docs.djangoproject.com/en/3.2/topics/db/examples/many_to_many/… 【参考方案1】:

您可以检索所有具有至少一个Category的组:

Group.objects.filter(<strong>category__in=group.category.all()</strong>).distinct()

.distinct() call [Django-doc] 阻止列出 Group 的次数与匹配的 categorys 相同。

另一种选择是反向使用关系,因此可以使用:

Group.objects.filter(<strong>category__tags=group</strong>).distinct()

然而,相关名称没有多大意义:related_name=… parameter [Django-doc] 是反向关系的名称,related_name='groups' 因此更有意义。在这种情况下,我们查询:

Group.objects.filter(<strong>category__groups=group</strong>).distinct()

【讨论】:

以上是关于在 M2M 字段 Django 中过滤标签的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中过滤第二级多对多关系

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

Django 在模板标签中过滤和计数

django xadmin

django中具有多个参数的过滤器和链式过滤器之间的区别

Django:使用“in”列表中的每个值进行 M2M 字段查询