Django过滤器和序列化器。过滤模型一对多嵌套值

时间:2017-03-21 15:14:34

标签: python django filter django-rest-framework

我知道如何通过嵌套值将过滤器应用于当前模型的视图集,并返回与此外键有关的所有数据。

如果我有一对一的关系,这没关系。但我有一对多的关系。所以我不知道如何过滤这些“很多价值”。

现在我已经这样了。

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

所以,版本是通过工具“常规”过滤的(这里不可见,但是一个版本已经出来)。但由于序列化程序,工具“成本”仍在查询中(我希望将其删除)。

我该如何实现?

1 个答案:

答案 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&param2=value2等。