序列化器中的 Django DRF 过滤字段
Django DRF filtering fields in serializer
我是 Django DRF 的新手,我正在尝试编写更有条理的代码,因为下面的代码缺乏正确的方法。
我有 2 个 API 端点:
- /api/order/info - 显示所有订单字段
- /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
我是 Django DRF 的新手,我正在尝试编写更有条理的代码,因为下面的代码缺乏正确的方法。
我有 2 个 API 端点:
- /api/order/info - 显示所有订单字段
- /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