我知道如何通过嵌套值将过滤器应用于当前模型的视图集,并返回与此外键有关的所有数据。
如果我有一对一的关系,这没关系。但我有一对多的关系。所以我不知道如何过滤这些“很多价值”。
现在我已经这样了。
filters.py :
var arr = [1,2,3,4,5,6,7,8,9,0,5];
var duplicate = arr.filter(function(item, i, arr) {
return -1 !== arr.indexOf(item, i + 1);
})
serializers.py :
class VersionFilter(FilterSet):
tool = CharFilter(method='tool_filter')
def tool_filter(self, queryset, name, value):
queryset = queryset.filter(changes__tool=value).distinct()
return queryset
class Meta:
model = Version
fields = ('tool')
viewsets.py :
class ChangeSerializer(serializers.ModelSerializer):
class Meta:
model = Change
fields = ('tool', 'date', 'type', 'title', 'description')
class VersionSerializer(serializers.ModelSerializer):
changes = ChangeSerializer(many=True, read_only=True)
class Meta:
model = Version
fields = ('date', 'version', 'changes')
以下是像class VersionViewSet(ReadOnlyModelViewSet):
model = Version
queryset = Version.objects.all()
serializer_class = VersionSerializer
filter_class = VersionFilter
这样的url smth的返回:
127.0.0.0/api/version?tool=General
所以,版本是通过工具“常规”过滤的(这里不可见,但是一个版本已经出来)。但由于序列化程序,工具“成本”仍在查询中(我希望将其删除)。
我该如何实现?
答案 0 :(得分:0)
class VersionFilter(FilterSet):
tool = CharFilter(method='tool_filter')
def tool_filter(self, request, queryset):
# get all values matching query params
tool = request.GET.get('tool')
date = request.GET.get('date')
type = request.GET.get('type')
title = request.GET.get('title')
description = request.GET.get('description')
data = {
"tool": tool,
"date": date,
"type": type,
"title": title,
"description": description
}
arguments = {}
# filter out values that evaluate to false e.g. None, ''
for k, v in data.items():
if v:
arguments[k] = v
# run query
queryset = queryset.objects.filter(**arguments)
return queryset
代码未经测试但如果您想在查询参数中返回过滤器非常有用,例如包含localhost:8000 /?param1=value1¶m2=value2
等。