Django DRF фильтрация полей в сериализаторе
Я новичок в Django DRF и пытаюсь написать более организованный код, так как тот, что приведен ниже, не имеет правильного подхода.
У меня есть 2 конечные точки API:
- /api/order/info - which shows all the order fields
- /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