首页 > 解决方案 > 原始异常文本为:“RelatedManager”对象没有属性“类型”。- 姜戈休息

问题描述

模型.py

class Sequence(models.Model):
    category_id = models.ForeignKey(SequenceCategory, on_delete=models.CASCADE)
    description = models.TextField()
    code = models.CharField(max_length=50)
    total_divisions = models.IntegerField()
    status = models.BooleanField(default=True)

    def __str__(self):
        return self.code


class SequenceValue(models.Model):
    TYPE_CHOICES =(
        ('N', 'Numeric'),
        ('A', 'Alphabet')
    )
    sequence_id = models.ForeignKey(Sequence, on_delete=models.CASCADE, blank=True, null=True, related_name='Sequence_details')
    type = models.CharField(max_length=100, choices=TYPE_CHOICES)
    value = models.CharField(max_length=50)
    starting_value = models.CharField(max_length=50, null=True, blank=True)
    increment_value = models.CharField(max_length=50, null=True, blank=True)

    def __str__(self):
        return self.value

序列化程序.py

class SequenceValueSerializer(serializers.ModelSerializer):
    class Meta:
        model = SequenceValue
        # fields = '__all__'
        exclude = ['sequence_id']


class SequenceSerializer(serializers.ModelSerializer):
    Sequence_details = SequenceValueSerializer()

    class Meta:
        model = Sequence
        fields = '__all__'

    def create(self, validate_data):
        Sequence_details_data = validate_data.pop('Sequence_details')
        sequence_id = Sequence.objects.create(**validate_data)
        SequenceValue.objects.create(sequence_id=sequence_id, **Sequence_details_data)
        return sequence_id

视图.py

class SequenceCreate(ListCreateAPIView):
    queryset = Sequence.objects.all()
    serializer_class = SequenceSerializer

为什么我会收到错误消息?当我参考 n 篇文章时,我得到了一个将 many=True 类似这样的解决方案。

Sequence_details = SequenceValueSerializer(many=True)

但是当我对此进行更改时,我无法获得序列详细信息字段。我该如何解决这个问题?请给个解决办法好吗?

实际错误-

type尝试获取序列化程序上的字段值时出现 AttributeError SequenceValueSerializer。序列化器字段可能命名不正确,并且与RelatedManager实例上的任何属性或键都不匹配。原始异常文本为:“RelatedManager”对象没有属性“类型”。

数据通行证

Data - {
    "Sequence_details": [{
        "type": "N",
        "value": "123",
        "starting_value": "1",
        "increment_value": "1"
    }],
    "description": "asd",
    "code": "qwe",
    "total_divisions": 2,
    "status": false,
    "category_id": 3
}

实际 eroor 截图

实际 eroor 截图

标签: pythondjangodjango-rest-framework

解决方案


添加many=True有效,因为您的请求数据Sequence_details作为列表传递。为了在您的序列化程序中使用它,您可以遍历该字段并创建您的对象,如下所示:

class SequenceSerializer(serializers.ModelSerializer):
    Sequence_details = SequenceValueSerializer(many=True)

    class Meta:
        model = Sequence
        fields = '__all__'

    def create(self, validate_data):
        Sequence_details_data = validate_data.pop('Sequence_details')
        sequence_id = Sequence.objects.create(**validate_data)

        for details in Sequence_details_data
            SequenceValue.objects.create(sequence_id=sequence_id, **details)
        return sequence_id

但是如果你不想这样做,你可以删除many=True并保持你的序列化器原样,但确保Sequence_details在你的请求中数据不是一个列表:

{
    "Sequence_details": {
        "type": "N",
        "value": "123",
        "starting_value": "1",
        "increment_value": "1"
    },
    "description": "asd",
    "code": "qwe",
    "total_divisions": 2,
    "status": false,
    "category_id": 3
}

推荐阅读