Почему мой Django сериализатор говорит мне, что атрибут не существует, когда я вижу его в моей модели? - PullRequest
0 голосов
/ 19 марта 2020

Я использую Python 3.7 и инфраструктуру отдыха Django для сериализации некоторых моделей в данные 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']

Я определил свою модель Label следующим образом ...

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)

1 Ответ

0 голосов
/ 19 марта 2020

В Article моделируется поле label, равное TextField, а не любые связанные поля. Но в вашем сериализаторе он ожидает связанное поле.

class ArticleSerializer(serializers.ModelSerializer):
    <strike>label = LabelSerializer()</strike>

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