Django DRF фильтрация полей в сериализаторе

Я новичок в Django DRF и пытаюсь написать более организованный код, так как тот, что приведен ниже, не имеет правильного подхода.

У меня есть 2 конечные точки API:

  1. /api/order/info - which shows all the order fields
  2. /api/order/status - which shows only one field

На данный момент у меня есть два сериализатора и два представления следующим образом:

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
Вернуться на верх