DRF使用过滤器查询外键值

时间:2018-01-24 11:43:57

标签: django django-rest-framework

如何在django rest框架中使用过滤条件查询外键值。我通过DRF StringRelatedField方法检索值,但我不知道如何在查询本身时进行过滤

models.py

class User(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

class Score(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   user_id = models.ForeignKey(User, related_name='score', on_delete=models.CASCADE)
   score = models.FloatField(null=False)

serilizer.py

class UserDetailsSerializer(serializers.ModelSerializer):

    score = serializers.StringRelatedField(many=True)
    class Meta:
        model = User
        fields = ('id', 'score', )

views.py

class UserDetailsRetrieveViewSet(viewsets.ModelViewSet):
     def list(self, request):
         queryset = User.objects.filter(score>=10)
         serializer = UserDetailsSerializer(queryset, many=True)

1 个答案:

答案 0 :(得分:0)

假设您需要在查看API时过滤User个对象,而您的API为/api/v1/user/。这种过滤可以通过两种方式实现,

1:使用 django queryset过滤器
您必须通过此类网址/api/v1/user/?score=10传递过滤器参数。重写你的观点如下,

class UserDetailsRetrieveViewSet(viewsets.ModelViewSet):
    def list(self, request):
        score = request.GET.get('score', None)
        queryset = User.objects.all()
        if score:
            queryset = queryset.filter(score__gte=score)
        serializer = UserDetailsSerializer(queryset, many=True)
        return Response(data=serializer.data)


2.使用 django-filter
如果您正在尝试使用该软件包,请不要忘记安装它。您的视图将是这样的,

class UserDetailsRetrieveViewSet(viewsets.ModelViewSet):
    queryset =  # your queryset
    serializer_class =  # your serializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('score',)

    def list(self, request):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def get_queryset(self):
        if self.action == 'list':
            return User.objects.all()
        else:
            return  # default queryset

让我知道它是否有效。