首页 / PYTHON / python – Django Rest Framework:当Serializer many = False时的AttributeError,但是当many = True时不是
python – Django Rest Framework:当Serializer many = False时的AttributeError,但是当many = True时不是
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Django Rest Framework:当Serializer many = False时的AttributeError,但是当many = True时不是,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4026字,纯文字阅读大概需要6分钟。
内容图文
![python – Django Rest Framework:当Serializer many = False时的AttributeError,但是当many = True时不是](/upload/InfoBanner/zyjiaocheng/773/d8f484a4542a4fb8b36dbc4dac5afff7.jpg)
我有幻灯片和图表模型,幻灯片只能包含1个图表.序列化数据时失败,出现以下错误:
AttributeError:尝试在序列化程序ChartSerializer上获取字段csv的值时获得AttributeError.
序列化程序字段可能名称不正确,并且与RelatedManager实例上的任何属性或键都不匹配.
原始异常文本是:’RelatedManager’对象没有属性’csv’.
但是,如果我只是改变:
chart = ChartSerializer(many=True)
在我的SlideSerializer(下面的代码)中它可以工作.这使得’chart’属性成为JSON中的一个列表,尽管它应该是一个对象,因为列表中只能有一个Chart,而不是很多(或者在这种情况下是一个)图表对象.
以下是我的模型(仅提供相关信息):
# models.py
...
class Slide(models.Model):
TYPE_MEDIA = 'media'
TYPE_CHART = 'chart'
TYPE_CHOICES = (
(TYPE_MEDIA, 'Media'),
(TYPE_CHART, 'Chart'),
)
title = models.CharField(max_length=255,)
type = models.CharField(choices=TYPE_CHOICES, max_length=5, default=TYPE_MEDIA)
media = models.FileField(
verbose_name='media',
upload_to='slides',
null=True,
blank=True,
)
internal_only = models.BooleanField(default=False)
creation_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
class Chart(models.Model):
slide = models.ForeignKey(Slide, related_name='chart')
csv = models.FileField(
verbose_name='csv',
upload_to='charts'
)
vertical_label = models.CharField(max_length=255,)
horizontal_label = models.CharField(max_length=255,)
creation_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
class ChartSeriesLabel(models.Model):
"""Series label associated with a chart"""
chart = models.ForeignKey(Chart, related_name='serieslabels')
number = models.CharField(max_length=255,)
label = models.CharField(max_length=255,)
creation_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
class ChartDataLabel(models.Model):
"""Data label associated with a chart"""
chart = models.ForeignKey(Chart, related_name='datalabels')
date = models.DateField()
label = models.CharField(max_length=255,)
creation_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
我的序列化器:
# serializers.py
...
class SeriesLabelSerializer(serializers.ModelSerializer):
class Meta:
model = ChartSeriesLabel
fields = ('number', 'label',)
class DataLabelSerializer(serializers.ModelSerializer):
class Meta:
model = ChartDataLabel
fields = ('date', 'label',)
class ChartSerializer(serializers.ModelSerializer):
serieslabels = SeriesLabelSerializer(many=True)
datalabels = DataLabelSerializer(many=True)
class Meta:
model = Chart
fields = ('csv', 'vertical_label', 'horizontal_label', 'serieslabels', 'datalabels')
class SlideSerializer(serializers.ModelSerializer):
chart = ChartSerializer()
class Meta:
model = Slide
fields = ('title', 'type', 'media', 'chart')
在SlideSerializer中使用chart = ChartSerializer(many = True)输出:
...
{
"title": "Slide 3",
"type": "chart",
"media": null,
"chart": [
{
"csv": "/media/commodities/Hall_of_Fame_Inductees.csv",
"vertical_label": "Vert",
"horizontal_label": "Horiz",
"serieslabels": [
{
"number": "1",
"label": "One"
},
{
"number": "2",
"label": "Two"
},
{
"number": "3",
"label": "Three"
}
],
"datalabels": [
{
"date": "2015-07-22",
"label": "This"
},
{
"date": "2015-07-23",
"label": "That"
},
{
"date": "2015-07-31",
"label": "The other"
}
]
}
]
},
...
Note that
chart
is a JSON list indicating that it could be many charts
在SlideSerializer中使用chart = ChartSerializer()的预期输出:
...
{
"title": "Slide 3",
"type": "chart",
"media": null,
"chart": {
"csv": "/media/commodities/Hall_of_Fame_Inductees.csv",
"vertical_label": "Vert",
"horizontal_label": "Horiz",
"serieslabels": [
{
"number": "1",
"label": "One"
},
{
"number": "2",
"label": "Two"
},
{
"number": "3",
"label": "Three"
}
],
"datalabels": [
{
"date": "2015-07-22",
"label": "This"
},
{
"date": "2015-07-23",
"label": "That"
},
{
"date": "2015-07-31",
"label": "The other"
}
]
}
},
...
但相反,它会抛出上面的错误.
解决方法:
你写的一切都很好.处理嵌套表示应该是项列表,您应该将many = True标志传递给嵌套的序列化程序.访问
http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects
所以你需要通过:
chart = ChartSerializer(many=True)
内容总结
以上是互联网集市为您收集整理的python – Django Rest Framework:当Serializer many = False时的AttributeError,但是当many = True时不是全部内容,希望文章能够帮你解决python – Django Rest Framework:当Serializer many = False时的AttributeError,但是当many = True时不是所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。