Django Rest框架订购非模型字段(序列化器字段)

时间:2018-12-12 11:40:15

标签: django-rest-framework

我想在我的字段上这样订购:

class DealerBackOfficeViewSet(mixins.ListModelMixin,
                          mixins.RetrieveModelMixin,
                          mixins.CreateModelMixin,
                          mixins.UpdateModelMixin,
                          viewsets.GenericViewSet):
filter_backends = (filters.OrderingFilter,
                   )
ordering_fields = ('online',...)

这种订购方式仅适用于模型的字段,但是在我的序列化程序中定义的在线字段以及在邮递员中进行测试时不起作用。 我想这样做:

class CustomOrdering(filters.OrderingFilter):

def filter_queryset(self, request, queryset, view):
    params = request.query_params.get(self.ordering_param)
    if params == 'online':
        ...   my serializer codes
    return super(CustomOrdering, self).filter_queryset(request, queryset, view)

此问题是其他领域订购不起作用!有什么办法可以解决吗? 如果相关文档对我有帮助,请给我链接。 感谢您的网站

2 个答案:

答案 0 :(得分:1)

在挑战中挣扎之后,我无法理解存在一种方法,该方法可以将该字段指示为模型字段,而无需CustomOrdering和任何其他代码! 在我的get_queryset函数中,我更改代码:

queryset = Dealer.objects.all()

收件人:

queryset = Dealer.objects.all().annotate(bids_count=Count('bid'), device_count=Count('device'))

请注意,序列化器中的这两个字段不在模型中。 在我的Serilizer中,将这两个字段从SerializerMethodField更改为IntegerField并清理defs。

然后在我的api文件中添加以下内容:

filter_backends = (filters.OrderingFilter,)
ordering_fields = ('bids_count', 'device_count')

这是我的最后一个序列化器:

class DealerListSerializer(serializers.ModelSerializer):
    device_count = serializers.IntegerField()
    bids_count = serializers.IntegerField()

    class Meta:
        model = Dealer
        fields = ('id', 'last_name', 'first_name', 'username', 'person_trust', 'is_active',
                  'work_type', 'address', 'mobile', 'device_count', 'online', 'bids_count')

这样,我的代码非常清晰,CustomOrdering和所有elif语句也很干净!

答案 1 :(得分:0)

它不起作用,因为在序列化程序中定义的字段不是模型的一部分。 ordering属性仅适用于模型字段。您可能必须引入一种解决方法,例如使用annotations创建动态字段,然后使用该字段进行排序,但这取决于是否可以注释您的在线字段逻辑。