gpt4 book ai didi

python - Django Rest Framework 不序列化 SerializerMethodField

转载 作者:太空狗 更新时间:2023-10-30 00:43:53 24 4
gpt4 key购买 nike

我有两个模型:

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)

我想创建序列化程序,将这两个模型一起序列化。我的 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()

因为充电器模型在状态字段中有选择,所以我添加了 SerializerMethodField 以显示完整状态。然后我创建一个这样的 View :

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)

但是当我调用这个 View 时,它返回带有空充电器字段的 json:

{
"battery": {
"energy": "12",
"current": "34"
},
"charger": {},
"some_field": "some_text"
}

但是当我创建一个仅序列化 Charger 模型的 View 时:

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的文档:

  1. instance 当你有一个对象并且你必须序列化它时传递。 (link)
  2. data 当您已经有序列化数据并且您想要反序列化它并从中创建一个实例时传递。 (link)
  3. instancedata 在您有一个实例并且您想要更新它时被传递。 (link)

看看你的情况,我认为你不需要选项 2 和 3,因为你有 batterycharger 实例,你需要将它们一起序列化。您不是在创建新实例,也不必验证它,因此不需要将其作为 data 传递。

有两种方法可以做到这一点:

1.创建一个 Device 类,这样您就可以创建它的一个实例,然后使用 DeviceSerializer 将其序列化:

class Device(object):

def __init__(self, battery, charger, some_field):
self.battery = battery
self.charger = charger
self.some_field = some_field

class DeviceView(APIView):
# then in the DeviceView you could create an instance and pass to the serializer
def get(self, request, format=None):
battery = Battery.objects.get(id=1)
charger = Charger.objects.get(id=1)
device = Device(battery=battery, charger=charger, some_field='some_text')
serializer = DeviceSerializer(instance=device)
return Response(serializer.data)

2.如果您不想创建一个新类,您可以直接创建一个dict 并将其作为实例传递:

class DeviceView(APIView):
def get(self, request, format=None):
battery = Battery.objects.get(id=1)
charger = Charger.objects.get(id=1)
# create a dict with required objects and pass it as instance of serializer
device = {'battery': battery, 'charger': charger, 'some_field': 'some_text'}
serializer = DeviceSerializer(instance=device)
return Response(serializer.data)

关于python - Django Rest Framework 不序列化 SerializerMethodField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36365326/

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