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)
实际错误截图
添加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)