【问题标题】:Serializing and deserializing in Django Rest FrameworkDjango Rest Framework 中的序列化和反序列化
【发布时间】:2014-08-08 15:57:46
【问题描述】:

作为 Django REST Framework 的新手,我在反序列化对象时遇到了问题,因为它在我的 ModelSerializer 中具有主键。 例如,我有 2 个扩展 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

现在,当我将我的 Order 模型序列化为 JSON 时,我得到了我想要的 - 对象“Order”以及关于它的“Courier”的详细嵌套信息:

[
    {
        id: 1,
        number: "000231",
        courier: {
            id: 2,
            first_name: "John",
            last_name: "Smith",
            phone: "12345678"
        }
    },
    ...
]

但在来自客户端的 POST 调用中,我只想接收到 Courier 的外键:

{
    id: 1,
    number: "000231",
    courier: 2
}

我应该在我的 OrderSerializer 类中添加什么来将这种 JSON 反序列化为 Order 模型?我应该写 restore_object() 吗?或者我应该编写额外的序列化程序来反序列化?它如何与我的 (generics.ListCreateAPIView) 视图一起使用,我可以为此使用两个单独的序列化程序(一个用于列表,一个用于发布)吗?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您可以向 Courier 添加带有主键的附加序列化程序:

    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 方法:

    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
    

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2018-07-04
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多