原始异常文本为:“RelatedManager”对象没有属性“type”。- 姜戈休息

Sar*_*ran 4 python django django-rest-framework

模型.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
Run Code Online (Sandbox Code Playgroud)

序列化器.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
Run Code Online (Sandbox Code Playgroud)

视图.py

class SequenceCreate(ListCreateAPIView):
    queryset = Sequence.objects.all()
    serializer_class = SequenceSerializer
Run Code Online (Sandbox Code Playgroud)

为什么我会收到错误消息?当我参考n篇文章时,我得到了一个解决方案,其中包含许多= True这样的东西。

Sequence_details = SequenceValueSerializer(many=True)
Run Code Online (Sandbox Code Playgroud)

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

实际错误-

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

数据通行证

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
}
Run Code Online (Sandbox Code Playgroud)

实际错误截图

实际错误截图

bdb*_*dbd 7

添加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
Run Code Online (Sandbox Code Playgroud)

但如果您不想这样做,您可以删除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
}
Run Code Online (Sandbox Code Playgroud)