Django的序列化:AttributeError的试图获得价值领域的串行

问题描述:

我收到以下错误时,Django的序列化:AttributeError的试图获得价值领域的串行

AttributeError: Got AttributeError when attempting to get a value for field devicedetails on serializer DISerializer . The serializer field might be named incorrectly and not match any attribute or key on the Device 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) 
+0

你'DISerializer.devicedetails'属性呢没有指定'source'参数。这意味着默认行为将被调用 - 在'Device'对象上通过该名称查找属性。 – Kendas

您需要将devicedetails字段重命名为devicedetails_set。对于关系自动生成反向名称填充为_set

devicedetails_set = DeviceDetailsSerializer(many=True) 

DeviceDetails'sdevice场使用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