Django Rest框架中的序列化和反序列化

Django Rest框架中的序列化和反序列化,django,django-rest-framework,Django,Django Rest Framework,作为Django REST框架的新手,我在ModelSerializer中给定主键的对象反序列化时遇到问题。 例如,我有两个扩展ModelSerializer的序列化程序: class CourierSerializer(serializers.ModelSerializer): class Meta: model = Courier fields = ( "first_name", "last_name",

作为Django REST框架的新手,我在ModelSerializer中给定主键的对象反序列化时遇到问题。 例如,我有两个扩展ModelSerializer的序列化程序:

class CourierSerializer(serializers.ModelSerializer):
    class Meta:
        model = Courier
        fields = (
            "first_name",
            "last_name",
            "phone"
        )

class OrderSerializer(serializers.ModelSerializer):
    courier = CourierSerializer()

    class Meta:
        model = Order
        fields = (
            "number",
            "courier"
        )
我基于类的视图如下所示:

class OrderList(generics.ListCreateAPIView):
    model = Order
    serializer_class = OrderSerializer
现在,当我将我的订单模型序列化为JSON时,我得到了我想要的东西——对象“订单”,以及关于它的“信使”的详细嵌套信息:

但在客户端的邮寄电话中,我只想收到快递公司的外键:

{
    id: 1,
    number: "000231",
    courier: 2
}
class OrderSerializerForPost(serializers.ModelSerializer):
    courier = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Order
        fields = (
            "number",
            "courier"
        )

我应该向OrderSerializer类中添加什么来将这种JSON反序列化到Order模型中?我应该写restore_object()吗?或者我应该编写额外的序列化程序来反序列化?如何使用我的(generics.ListCreateAPIView)视图,我可以使用两个单独的序列化程序(一个用于list,一个用于post)来实现此目的吗?

您可以向Courier添加其他具有主键的序列化程序:

{
    id: 1,
    number: "000231",
    courier: 2
}
class OrderSerializerForPost(serializers.ModelSerializer):
    courier = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Order
        fields = (
            "number",
            "courier"
        )
然后将其与您的重写后方法一起使用

class OrderList(generics.ListCreateAPIView):

    model = Order
    serializer_class = OrderSerializer

    def post(self, request):
        self.serializer_class = OrderSerializerForPost
        super(OrderList, self).post(request)
或者,您可以尝试重新定义get_serializer_类方法:

class OrderList(generics.ListCreateAPIView):

    model = Order
    serializer_class = OrderSerializer

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return self.serializer_class
        elif self.request.method == 'POST':
            return OrderSerializerForPost

谢谢,正是我需要的。