Django的序列化:AttributeError的试图获得价值领域的串行
问题描述:
我收到以下错误时,Django的序列化:AttributeError的试图获得价值领域的串行
AttributeError: Got AttributeError when attempting to get a value for field
devicedetails
on serializerDISerializer
. The serializer field might be named incorrectly and not match any attribute or key on theDevice
instance. Original exception text was: 'Device' object has no attribute 'devicedetails'.
我的models.py: -
class DeviceInfo(models.Model):
vendor = models.CharField(max_length=250)
device_type = models.CharField(max_length=250)
modelname = models.CharField(max_length=100)
class Device(models.Model):
name = models.CharField(max_length=100, primary_key=True)
username = models.TextField()
password = EncryptedTextField()
deviceinfo = models.ForeignKey(DeviceInfo, null=True)
class DeviceDetails(models.Model):
device = models.ForeignKey(Device)
serial_number = models.CharField(max_length=100)
version = models.CharField(max_length=100)
serializer.py: -
class DeviceInfoSerializer(serializers.ModelSerializer):
class Meta:
model = DeviceInfo
fields = ("id", "vendor", "device_type", "modelname")
class DeviceSerializer(serializers.ModelSerializer):
class Meta:
model = Device
fields = ("name","username", "password", "deviceinfo")
class DeviceDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = DevieceDetails
fields = ("device", "serial_number", "version")
class DISerializer(serializers.ModelSerializer):
deviceinfo = DeviceInfoSerializer(read_only=True)
devicedetails = DeviceDetailsSerializer(many=True)
class Meta:
model = Device
fields = ("name", "username", "password", "deviceinfo", "devicedetails")
views.py: -
def list(self, request):
list = Device.objects.all()
serializer = DISerializer(list, many=True)
答
您需要将devicedetails
字段重命名为devicedetails_set
。对于关系自动生成反向名称填充为_set
:
devicedetails_set = DeviceDetailsSerializer(many=True)
或DeviceDetails's
device
场使用related_name
:
device = models.ForeignKey(Device, related_name='devicedetails')
从docs:
If you have not set a related name for the reverse relationship, you'll need to use the automatically generated related name in the fields argument. For example: track_set
你'DISerializer.devicedetails'属性呢没有指定'source'参数。这意味着默认行为将被调用 - 在'Device'对象上通过该名称查找属性。 – Kendas