我有两个模型:
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)
我想创建序列化程序,将这两个模型序列化在一起。我的序列化程序.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()
因为充电器型号在状态字段中有选择,所以我添加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)
但是当我调用这个视图时,它返回带有空charger字段的json:
{
"battery": {
"energy": "12",
"current": "34"
},
"charger": {},
"some_field": "some_text"
}
但是当我创建一个只序列化充电器模型的视图时:
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"
}
为什么会这样?我错在哪里了?
查看
Serializers
的文档:instance
在有对象且必须序列化时传递。(link)data
在您已经序列化了数据并希望反序列化它并从中创建实例时传递。(link)instance
和data
都被传递看看你的案例,我认为你不需要选项2和3,因为你有
battery
和charger
实例,你需要一起序列化它。您不需要创建新实例,也不需要验证它,因此不需要将其作为data
传递。有两种方法可以做到这一点:
1.创建一个类
Device
,这样您就可以创建它的一个实例,然后使用DeviceSerializer
序列化它:2.如果不想继续创建新类,可以直接创建一个
dict
,并将其作为实例传递:好像你在做你不必做的工作。如果在将充电器传递给
DeviceSerializer
之前对其进行序列化,则实际上传递的是dict
,而不是Charger
实例,dict
没有get_status_display
方法。您应该像这样直接传递Battery
和Charger
:请注意,还可以通过将SerializerMethodField替换为CharField来简化:
编辑:正如AKS所指出的,当序列化(
data
用于反序列化)时,应该传递一个序列化程序instance
,而不是data
,并且不需要检查.is_valid()
在创建序列化程序实例时传递关键字数据,只有在反序列化数据时才使用此开关。 您应该创建一个带有所需字段的对象的DeviceSerializer。 我没试过,但可能是这样的
相关问题 更多 >
编程相关推荐