gpt4 book ai didi

django - Django Rest Framework 中的序列化和反序列化

转载 作者:行者123 更新时间:2023-12-03 19:21:02 25 4
gpt4 key购买 nike

作为 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"
)

我的基于类的 View 如下所示:

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) View 一起工作,我可以为此目的使用两个单独的序列化程序(一个用于列表,一个用于发布)吗?

最佳答案

您可以向 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

关于django - Django Rest Framework 中的序列化和反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com