Django Rest Framework可以过滤多个领域

时间:2015-07-24 09:45:28

标签: django django-rest-framework django-filter

我正在尝试通过它的名称字段过滤manytomany字段,但我无法正确设置它。任何人都可以看看这个吗?

模型

class Criteria(models.Model):
    name = models.CharField(max_length=400, primary_key=True)
    tests = models.ManyToManyField(Test)

class Test(models.Model):
    name = models.CharField(max_length=4000)

视图

class CriteriaViewSet(DefaultsMixin, viewsets.ModelViewSet):
    queryset = Criteria.objects.all()
    filter_class = CriteriaFilter
    filter_fields = ('tests',)


    def get_serializer_class(self):
        if self.action == 'list':
            return CriteriaSerializer
        return CriteriaDetailSerializer

Filterset

class CriteriaFilter(django_filters.FilterSet):
    test = django_filters.CharFilter(name="tests__name", lookup_type='contains')
    class Meta:
        model = Criteria
        fields = ('tests',)

串行器

class CriteriaSerializer(serializers.ModelSerializer):
    tests = serializers.StringRelatedField(many=True)
    links = serializers.SerializerMethodField()

    class Meta:
        model = Criteria
        fields = ('name', 'tests', 'links')

    def get_links(self, obj):
        request = self.context['request']
        return {
            'self': reverse('api:criterium-detail',
            kwargs={'pk': obj.pk},
            request=request),
        }

使用上面的配置,我在URL上获得了:

  

/ API /标准/?测试= FB1400

是空结果数组,即使有许多Criteria包含已解决的测试:

HTTP 200 OK Content-Type: application/json Vary: Accept Allow: GET, POST, HEAD, OPTIONS

{
    "count": 0,
    "next": null,
    "previous": null,
    "results": []
}

我在fields尝试了不同的查找(精确,在,包含)以及不同的值,但这些都不适用于我... 我也想知道我是否应该在某处设置django过滤后端,但我不知道该怎么做,我不知道在这种情况下是否有必要。

1 个答案:

答案 0 :(得分:0)

不确定你是否解决了这个问题,但这篇文章与其他文章类似,后来解决了这个问题:

Django Rest Framework (GET filter on ManyToMany field)

希望这有帮助。