django - 如何在序列化程序中过滤

时间:2017-06-14 10:42:53

标签: django django-rest-framework serializer

class User(generics.RetrieveAPIView):
    serializer_class = RetrieveLocalSerializer
    queryset = User.objects.filter(
        fields_1=True,
        fields_2=False 
    )

class LocalSerializer(serializers.ModelSerializer):
     class Meta:
         model = User
         fields = ('field_1', 'field_2', 'field_3',)

API没有按照我的意愿运作。当我尝试获得没有我想要的属性的用户时,它仍然返回结果。

我甚至尝试覆盖该功能,但它也没有用。

    def get_queryset(self): 
    return User.objects.filter(
        is_localguide=True,
        state=PROFILE_STATE.PUBLISHED
    )

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,您希望获得视图中的实例列表(使用Django Rest Framework)。问题是您的视图是从generics.RetrieveAPIView继承的。此视图类调用self.retrieve(request, *args, **kwargs)方法,该方法返回一个对象,而不是查询集。我认为你应该从ListAPIView类继承你的观点。该类继承了ListModelMixin

  

提供.list(request,* args,** kwargs)方法,用于实现列出查询集。

所以你的代码看起来像这样:

class User(generics.ListAPIView):
    serializer_class = RetrieveLocalSerializer
    queryset = User.objects.filter(
        fields_1=True,
        fields_2=False 
    )

有关详细信息,请参阅http://www.django-rest-framework.org/api-guide/generic-views/#listapiview

您可以在视图中定义查询集,也可以覆盖get_queryset方法:

  

queryset - 应该用于从此视图返回对象的查询集。通常,您必须设置此属性,或覆盖get_queryset()方法。如果要覆盖视图方法,则必须调用get_queryset()而不是直接访问此属性,因为queryset将被评估一次,并且将为所有后续请求缓存这些结果。

您可以在此处找到更多信息:http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview

希望这会有所帮助)