【问题标题】:Why is my Django serializer telling me an attribute doesn't exist when I see it defined in my model?为什么当我看到模型中定义的属性时,我的 Django 序列化程序告诉我该属性不存在?
【发布时间】:2020-06-30 02:44:33
【问题描述】:

我正在使用 Python 3.7 和 Django rest 框架将一些模型序列化为 JSOn 数据。我有这个

    data = {
    'articlestats': ArticleStatSerializer(articlestats, many=True).data,

然后我定义了以下序列化程序...

class LabelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Label
        fields = ['name']
...
class ArticleSerializer(serializers.ModelSerializer):
    label = LabelSerializer()

    class Meta:
        model = Article
        fields = ['id', 'title', 'path', 'url', 'label']

class ArticleStatSerializer(serializers.ModelSerializer):
    article = ArticleSerializer()

    class Meta:
        model = ArticleStat
        fields = ['id', 'article', 'score']

我已经像这样定义了我的标签模型......

class Label(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

    class Meta:
        unique_together = ("name",)

但是当 Django 处理我的序列化行时出现此错误...

AttributeError: Got AttributeError when attempting to get a value for field `name` on serializer `LabelSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `str` instance.
Original exception text was: 'str' object has no attribute 'name'.

不知道为什么抱怨。 “名称”属性就在那里。我还应该做什么?

编辑:模型要求...

class ArticleStat(models.Model):
    objects = ArticleStatManager()
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
    score = models.FloatField(default=0, null=False)



class Article(models.Model):
    objects = ArticleManager()
    title = models.TextField(default='', null=False)
    path = models.TextField(default='', null=False)
    url = models.TextField(default='', null=False)
    label = models.TextField(default='', null=True)
    created_on = models.DateTimeField(db_index=True, default=datetime.now)

【问题讨论】:

  • 您能添加您的ArticleStat 和Article 模型吗?
  • @ArakkalAbu,模型已添加

标签: json django serialization django-rest-framework


【解决方案1】:

在 Article 模型中,label 字段是 TextField,不是任何类型的相关字段。但是在您的序列化程序中,它需要一个相关字段。

class ArticleSerializer(serializers.ModelSerializer):
    label = LabelSerializer()

    class Meta:
        model = Article
        fields = ['id', 'title', 'path', 'url', 'label']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2015-05-19
    • 1970-01-01
    • 2019-02-16
    • 2021-06-30
    相关资源
    最近更新 更多