django - Django Rest Framework Serializer 不打印嵌套关系
问题描述
我已经建立了 2 个模型之间的关系:Order
和OrderLine
. 我按照 DRF 文档为它们创建了序列化程序,但是在打印serializer.data
嵌套对象时没有显示。
这是我的模型:
class Order(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
session_id = models.CharField(max_length=256)
class OrderLine(models.Model):
order_id = models.ForeignKey(Order, on_delete=models.DO_NOTHING)
product_id = models.ForeignKey(Product, on_delete=models.DO_NOTHING)
price = models.DecimalField(decimal_places=2, max_digits=20)
quantity = models.IntegerField()
total = models.DecimalField(decimal_places=2, max_digits=20)
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
这些是序列化程序:
from rest_framework import serializers
from .models import Order, OrderLine
class OrderLineSerializer(serializers.ModelSerializer):
"""
OrderLine serializer
"""
class Meta:
model = OrderLine
fields = ['product_id', 'price', 'quantity', 'total']
class OrderSerializer(serializers.ModelSerializer):
"""
Order serializer
"""
items = OrderLineSerializer(many=True, read_only=True)
class Meta:
model = Order
fields = ['session_id', 'subtotal', 'total', 'items']
read_only_fields = ['id']
这是视图:
class OrderAPIViewSet(viewsets.ViewSet):
def create(self, request):
order = Order.objects.create(session_id=request.data['session_id'])
for item in request.data['items']:
product = Product.objects.get(pk=item['product_id'])
total = Decimal(item['price'] * item['quantity'])
OrderLine.objects.create(
order_id=order,
product_id=product,
price=Decimal(item['price']),
quantity=item['quantity'],
total=total
)
serializer = OrderSerializer(instance=order)
print("HERE")
print(serializer.data)
return Response(status=status.HTTP_200_OK)
从我的 REST 客户端,我发布了以下对象:
{
"session_id":uuid,
"items": [
{
"product_id": product.id,
"price": 5.80,
"quantity": 2,
}
]
}
但是当视图中的打印语句被执行时,这就是正在打印的内容:
{
"session_id":"4def7bdb-dedb-46aa-9c70-1d9e4f522149",
"subtotal":"0.00",
"total":"0.00"
}
请注意未包含项目子资源。
我错过了什么?
解决方案
因为您将read_only=True
参数传递给OrderLineSerializer
. 当您的序列化程序的内置方法to_internal_value()
运行时,清除不包括在您的字段列表中的数据。有关更多详细信息:read_only
推荐阅读
- excel - 通过偏移方法将单元格复制到另一个工作表
- reactjs - 当我从端口 8000 提供服务时,为什么 fetch 调用在端口 3000 上工作?
- python - 密码重置未重定向到 django 中的模板 html 文件
- javascript - 如何判断数组是否包含任何子字符串
- javascript - 测量 div 上的时间量
- javascript - Django 无法加载 javascript 但加载 css(包括项目链接)
- reactjs - 使用添加计数按钮重新渲染太多
- html - 如何更改 textarea 中特定文本的背景颜色?
- sockets - 在 git bash 中杀死一个进程
- excel - 分配要粘贴复制的数据 VBA 的列