如何使用 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
方法本身中我同时使用了team1
和team2
属性
【讨论】:
【参考方案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 中的一个或另一个字段的主要内容,如果未能解决你的问题,请参考以下文章