python – Django Rest Framework:当Serializer many = False时
我有幻灯片和图表模型,幻灯片只能包含1个图表.序列化数据时失败,出现以下错误:
AttributeError:尝试在序列化程序ChartSerializer上获取字段csv的值时获得AttributeError. 但是,如果我只是改变: 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',) 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" } ] } ] },...
在SlideSerializer中使用chart = ChartSerializer()的预期输出: ... { "title": "Slide 3","chart": { "csv": "/media/commodities/Hall_of_Fame_Inductees.csv","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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |