python - 在 DRF 中创建对象和子对象
问题描述
我有 2 个序列化器,Order 和 OrderDetail:
class OrderSerializer(serializers.ModelSerializer):
detail = serializers.SerializerMethodField()
class Meta:
model = Order
fields = ['pk', 'user', 'date', 'status', 'detail ']
def create(self, validated_data):
order= Order.objects.create(**validated_data)
detail_data = validated_data.pop('detail')
if detail_data :
for detail in detail_data :
OrderDetail.objects.create(order=order, **detail)
return order
def get_detail(self, obj):
"""obj is an order instance. Return list of dicts"""
queryset = OrderDetail.objects.filter(order= obj)
return [OrderDetailSerializer(m).data for m in queryset]
和
class OrderDetailSerializer(serializers.ModelSerializer):
""" Just in case if its needed for create for multiple instances """
def __init__(self, *args, **kwargs):
many = kwargs.pop('many', True)
super(OrderDetailSerializer, self).__init__(many=many, *args, **kwargs)
order = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all())
product = serializers.PrimaryKeyRelatedField(queryset=Product.objects.all())
class Meta:
model = OrderDetail
fields = ['pk', 'order', 'product', 'quantity','individual_price']
在邮递员中,我发送:
{
"user": 1,
"date": "2020-06-02",
"status": "Approved",
"detail": [
{
"product": 2,
"quantity": "3",
"individual_price": "15.00"
},
{
"product": 1,
"quantity": "1",
"individual_price": "10.00"
}
]
}
它会引发以下错误:
/api/v1/order/'detail' 处的 KeyError
请求方式:POST 请求网址:http://localhost:8000/api/v1/order/ Django 版本:3.0.3
当我打印数据时,它显示:
{'user': <User: test>, 'date': datetime.date(2020, 6, 3), 'status': 'Approved'}
似乎详细它是一个只读字段,不知道它是否用于 SerializerMethodField。关于这一点,我需要 SerializerMethodField 的详细信息来格式化响应,如下所示:
results": [
{
"pk": 1,
"user": 1,
"date": "2020-06-03",
"status": "Approved",
"detail": [
{
"pk": 2,
"order": 1,
"product": 2,
"quantity": "3",
"individual_price": "15.00"
},
{
"pk": 3,
"order": 1,
"product": 1,
"quantity": "1",
"individual_price": "10.00"
}
]
},
我也在视图中使用 ListCreateAPIView 并且模型具有与序列化程序中的字段相同的信息
class OrderList(generics.ListCreateAPIView):
"""
Returns orders by user
"""
queryset = Order.objects.all()
serializer_class = OrderSerializer
permission_classes = [IsAuthenticated]
authentication_classes = [TokenAuthentication, SessionAuthentication]
def get_queryset(self):
user = self.request.user
return Order.objects.filter(user=user)
解决方案
推荐阅读
- javascript - 诺克测试的正则表达式匹配失败
- excel - 使用powershell过滤和删除excel中的行
- python - 在 Django 模板中将长 {% with %} 分配分成多行
- c - 谁能弄清楚为什么我的将句子拆分为单词的程序(在 C 中)不起作用?
- regex - 正则表达式在匹配字符的行中查找第一次出现的字符
- typescript - 如何创建嵌套的 d.ts 文件?
- akka-stream - 如何从服务器端终止 akka websocket 连接?
- php - 当字段更改值时尝试在 FPDF 中进行分页
- apache-flink - 运行许多作业时,主要的 Flink 瓶颈是什么?
- excel - 在excel数据透视表中,如何计算该行中一行项目的百分比?