【问题标题】:Django Rest Framework filterset on many to many field多对多领域的 Django Rest Framework 过滤器集
【发布时间】:2015-10-14 22:27:03
【问题描述】:

我正在尝试通过它的名称字段过滤 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

过滤器集

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/criteria/?test=FB1400

即使有许多包含已寻址测试的标准,结果数组也是空的:

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

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

我在fields 中尝试了不同的查找(精确、包含、包含)以及不同的值,但这些都不适合我... 我也想知道是否应该在某处设置 django 过滤器后端,但我不确定如何执行此操作,也不知道在这种情况下是否有必要。

【问题讨论】:

  • 在 DRF 2.4.4 中,您必须在视图集中指定 filter_backends,例如 filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,)

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


【解决方案1】:

不知道你是否解决了,但是这篇文章和其他的类似,顺便解决了:

Django Rest Framework (GET filter on ManyToMany field)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 2015-09-21
    • 2018-07-28
    • 2018-10-03
    • 2017-01-15
    • 1970-01-01
    • 2019-03-06
    • 2015-03-24
    • 2021-03-09
    相关资源
    最近更新 更多