Django筛选器并使用数组查询

Die*_*sel 3 python api django django-filter django-rest-framework

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

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
Run Code Online (Sandbox Code Playgroud)

但是我想根据ID列表或home_ports列表获取一系列船只,并且尝试了:

http://127.0.0.1:8000/api/v1/boats/boats?id=10,11
http://127.0.0.1:8000/api/v1/boats/boats?id_in=10,11
http://127.0.0.1:8000/api/v1/boats/boats?id=10,id=11
http://127.0.0.1:8000/api/v1/boats/boats?id=10&id=11
Run Code Online (Sandbox Code Playgroud)

但是这些不起作用。用django-filter做到这一点的最好方法是什么,URL规则是如何定义的?

这是我的看法:

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

我标记为接受的解决方案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)
Run Code Online (Sandbox Code Playgroud)

Ani*_*rma 5

doniyor给出的答案很恰当。但是我猜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)
Run Code Online (Sandbox Code Playgroud)