djangfilter和数组查询

2024-10-06 11:25:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的问题:目前我可以这样做以从后端获取对象:

http://127.0.0.1:8000/api/v1/boats/boats?id=10
http://127.0.0.1:8000/api/v1/boats/boats?home_port=98&id=5

但我想根据ID列表或家庭端口列表获得一系列船只,我已经尝试过:

^{pr2}$

但这些都不管用。使用django过滤器最好的方法是什么,URL规则是如何定义的?在

以下是我的观点:

class BoatList(generics.ListCreateAPIView):
    permission_classes = (IsOwnerOrReadOnly,)
    serializer_class = BoatSerializer
    queryset = Boat.objects.all()
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'home_port',)

我标记的解决方案100%地回答了我的问题,但我最终根据另一篇使用过滤器的帖子实现了一些不同的东西:

class ListFilter(Filter):

    def filter(self, qs, value):
        if not value:
            return qs

        self.lookup_type = 'in'
        values = value.split(',')
        return super(ListFilter, self).filter(qs, values)

class BoatFilter(FilterSet):
    ids = ListFilter(name='id')

    class Meta:
        model = Boat
        fields = ['home_port', 'ids']


class BoatList(generics.ListCreateAPIView):
    permission_classes = (IsOwnerOrReadOnly,)
    serializer_class = BoatSerializer
    queryset = Boat.objects.all()
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = BoatFilter

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

Tags: selfapiidhttphomevalueportfilter
3条回答

多尼尔给出的答案很贴切,但我想request在使用它的地方是不可用的。在

还有另一种方法这个。你无法重写get_queryset方法。可按如下方式进行:

class BoatList(generics.ListCreateAPIView):
    permission_classes = (IsOwnerOrReadOnly,)
    serializer_class = BoatSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'home_port',)

    def get_queryset(self):
        id_list = self.request.GET.getlist("id")
        if not id_list:
            return []
        return Boat.objects.filter(id__in=id_list)

你只需创建一个过滤器类

    class NumberInFilter(BaseInFilter, NumberFilter):
          pass


    class myFilter(FilterSet):
          id__in = NumberInFilter(field_name='id', lookup_expr='in')

          class Meta:
                model = Boat

在视图集中使用

^{pr2}$

您可以看到django过滤器的以下文档: https://django-filter.readthedocs.io/en/master/ref/filters.html?highlight=BaseInFilter

试试这个:

网址:http://127.0.0.1:8000/api/v1/boats/boats?id=10,11

class BoatList(generics.ListCreateAPIView):
    permission_classes = (IsOwnerOrReadOnly,)
    serializer_class = BoatSerializer
    queryset = Boat.objects.filter(id__in=request.GET.getlist('id')) #<   
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'home_port',)

相关问题 更多 >