【发布时间】:2016-07-21 18:59:30
【问题描述】:
我有 2 个模型:
from django.db import models
STATUSES = (
('f', 'Finished'),
)
class Battery(models.Model):
energy = models.CharField(max_length=10)
current = models.CharField(max_length=10)
class Charger(models.Model):
status = models.CharField(max_length=1, choices=STATUSES)
我想创建将这 2 个模型一起序列化的序列化程序。我的 serializers.py:
from rest_framework import serializers
from .models import Battery, Charger
class BatterySerializer(serializers.ModelSerializer):
class Meta:
model = Battery
class ChargerSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
class Meta:
model = Charger
def get_status(self, obj):
return obj.get_status_display()
class DeviceSerializer(serializers.Serializer):
battery = BatterySerializer()
charger = ChargerSerializer()
some_field = serializers.CharField()
因为 Charger 模型在状态字段中有选择,所以我添加了 SerializerMethodField 来显示完整状态。然后我创建一个这样的视图:
class DeviceView(APIView):
def get(self, request, format=None):
battery = Battery.objects.get(id=1)
charger = Charger.objects.get(id=1)
battery_serializer = BatterySerializer(battery)
charger_serializer = ChargerSerializer(charger)
serializer = DeviceSerializer(data={
'battery': battery_serializer.data,
'charger': charger_serializer.data,
'some_field': 'some_text'
})
if serializer.is_valid():
return Response(serializer.validated_data)
else:
return Response(status = 500)
但是当我调用这个视图时,它会返回带有空充电器字段的 json:
{
"battery": {
"energy": "12",
"current": "34"
},
"charger": {},
"some_field": "some_text"
}
但是当我创建一个仅序列化 Charger 模型的视图时:
class ChargerView(APIView):
def get(self, request, format=None):
charger = Charger.objects.get(id=1)
charger_serializer = ChargerSerializer(charger)
return Response(charger_serializer.data)
它可以工作并返回这个 json:
{
"id": 1,
"status": "Finished"
}
为什么会这样?我哪里做错了?
【问题讨论】:
-
为什么不能在视图中同时调用
BatterySerializer和ChargerSerializer方法并返回它们?因为那是你的DeviceSerializer正在做的事情。 -
如何将它们一起退回?
-
喜欢这个
{ 'battery': battery.__dict__, 'charger': charger.__dict__, 'some_field': 'some_text' }?不确定这是否是正确的方法。 -
您在
serializer.is_valid()中验证什么?可以直接回Response(serializer.data)看看有什么收获吗? -
当我尝试返回
Response(serializer.data)它引发 AssertionError:When a serializer is passed a data keyword argument you must call .is_valid() before attempting to access the serialized .data representation. You should either call .is_valid() first, or access .initial_data instead.
标签: python json django serialization django-rest-framework