如何使用 FilterUserMixin 过滤 Django 中的一个或另一个字段

Posted

技术标签:

【中文标题】如何使用 FilterUserMixin 过滤 Django 中的一个或另一个字段【英文标题】:How to use a FilterUserMixin to filter one field or the other in Django 【发布时间】:2020-04-10 05:18:10 【问题描述】:

我正在使用 FilterUserMixin 过滤表单中的数据。我有具有属性“team1”和“team2”的模型“Game”。我希望过滤器获取列表中某个团队是 team1 或 team2 的所有游戏。我的过滤器如下所示:

class GamesFilter(FilterUserMixin):
   name = django_filters.CharFilter(method='filter_name', label='Team name')
   def filter_name(self,queryset,name,value):
       queryset = queryset.filter(team2=value) | queryset.filter(team1=value)
       return queryset
   class Meta:
       model = Game
       fields = ('team1','team2',)

过滤器确实出现在表单中,它显示了所有注册的球队(它是一个 ModelChoiceField,所以是一个列表,而不是一个要输入的 CharField),它正确显示了比赛,但只显示了搜索球队所在的球队“team1”字段,而不是“team2”。您有什么想法吗?我对此比较陌生,并且尝试了一些不成功的事情。

【问题讨论】:

【参考方案1】:

我发现了问题所在。方法的名称 (filter_name) 是从具有 name 属性的不同模型的不同过滤器复制而来的。我将方法名称更改为filter_team1,然后它突然起作用了,即使在filter_team1 方法本身中我同时使用了team1team2 属性

【讨论】:

【参考方案2】:
from django.db.models import Q
queryset = queryset.filter(Q(team2=value) | Q(team1=value))

您可以查看参考:How to perform OR condition in django queryset?

【讨论】:

我试过了,它的工作原理是一样的,只有当 team1 是团队时。我认为这可能与 FilterUserMixin 特别有关,我真的不知道它是如何工作的,但这是我的同事在这个项目中使用的。

以上是关于如何使用 FilterUserMixin 过滤 Django 中的一个或另一个字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用列表包含值来过滤列的数据帧

我如何使用 baseadapter 过滤列表视图

如何使用正则表达式或熊猫过滤 NLTK 的 FreqDist 计数器

bootstrap-table 如何使用搜索和过滤?

如何根据任意条件函数过滤字典?

如何使用 Rxjava 在 Android Kotlin 中过滤数据