加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Django Rest Framework:当Serializer many = False时

发布时间:2020-12-20 13:52:24 所属栏目:Python 来源:网络整理
导读:我有幻灯片和图表模型,幻灯片只能包含1个图表.序列化数据时失败,出现以下错误: AttributeError:尝试在序列化程序ChartSerializer上获取字段csv的值时获得AttributeError. 序列化程序字段可能名称不正确,并且与RelatedManager实例上的任何属性或键都不匹配.
我有幻灯片和图表模型,幻灯片只能包含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',)


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","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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读