python - 原始异常文本为:“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 截图
解决方案
添加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
}
推荐阅读
- maps - Bing Maps 上的叠加图钉 - 如何显示两者的元数据或以一定的缩放比例将图钉分开
- reactjs - ReactNative 我无法传递到另一个页面
- mongodb - 关于 Express-session 中间件的一般疑问
- javascript - 会话的返回路径
- python - 如何检测 URL 是否在 Chrome 中打开?
- java - webflux和reactor的正确使用方法是什么
- python - 在集合列表中查找重复集合
- python - 使用 librosa 加载文件夹和子文件夹时出现类型转换错误
- html - Go中将webcolor html颜色名称转换为十六进制的函数| 深橙色->#FF8C00
- jpa - SQL 连接到 Java Criteria API