序列化器中的 Django DRF 过滤字段

Django DRF filtering fields in serializer

我是 Django DRF 的新手,我正在尝试编写更有条理的代码,因为下面的代码缺乏正确的方法。

我有 2 个 API 端点:

  1. /api/order/info - 显示所有订单字段
  2. /api/order/status - 只显示一个字段

目前我有两个序列化器和两个视图如下:

serializers.py

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ['order_id', 'data', 'status']
    
class OrderStatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ['status']



views.py

# /api/order/info - retrieves all fields
class OrderInfo(generics.RetrieveAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer
    
    def get_object(self):
        try:
            return Order.objects.get(pk=self.request.data['uuid'])
        except Order.DoesNotExist:
            raise Http404
    
# /api/order/status - retrives just one field, the status
class OrderStatus(generics.RetrieveAPIView):
    queryset = Order.objects.all()
    serializer_class = OrderStatusSerializer # a serializer just for this
    
    def get_object(self):
        try:
            return Order.objects.get(pk=self.request.data['uuid'])
        except Order.DoesNotExist:
            raise Http404

问题:代码按预期工作,但很明显它是重复

我正在创建一个新的序列化程序来过滤一个字段,但我坚信 DRF 在某种程度上使这更容易。

能否请您提出更好的方法? 谢谢

这是否解决了您的问题?

  • 观看次数
class OrderBase(generics.RetrieveAPIView):
    queryset = Order.objects.all()
    
    def get_object(self):
        try:
            return Order.objects.get(pk=self.request.data['uuid'])
        except Order.DoesNotExist:
            raise Http404


class OrderInfo(OrderBase):
    serializer_class = OrderSerializer
    

class OrderStatus(OrderBase):
    serializer_class = OrderStatusSerializer
  • 序列化器
class MetaBase:
    model = Order
    fields = '__all__'


class OrderSerializer(serializers.ModelSerializer):
    class Meta(MetaBase):
        fields = ['order_id', 'data', 'status']
    
class OrderStatusSerializer(serializers.ModelSerializer):
    class Meta(MetaBase):
        fields = ['status']

这叫做继承 ;)

您可以尝试使用 django rest framework to_representation 方法只发送您需要的字段。

class OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Order
        fields = ['order_id', 'data', 'status']

    def to_representation(self, instance) -> OrderedDict:
        fields = super(OrderSerializer, self).to_representation(instance)
        ret = OrderedDict()
        # your logic to filter out fields based on the request path
        return ret