【问题标题】:How to get an extra column in relational model in Django-rest-framework serializer?如何在 Django-rest-framework 序列化程序中的关系模型中获得额外的列?
【发布时间】:2015-04-18 07:37:08
【问题描述】:

我有CategoryArticle 模型,Article 有一个外键引用Category,在我的serializer 中,由于__str__ 方法,我可以在类别模型中获取名称列,但是我怎样才能得到Category 模型中的其他列

models.py:

# blog category models
class Category(models.Model):
    #id = models.IntegerField(primary_key=True,help_text='primary key',auto_created=True)
    name = models.CharField(max_length=50,help_text='category name')
    description = models.TextField(default='',help_text='category description')
    coverimg = models.CharField(max_length=200,default='',help_text='category front cover image')
    covercolor = models.CharField(max_length=7,default='#ffffff',help_text='color for each category background')
    totalitems = models.IntegerField(default=0,help_text='total items for each category')
    createtime = models.DateTimeField(auto_now_add=True)
    modifytime = models.DateTimeField(auto_now=True)

    categories = models.Manager()

    class Meta:
        db_table = 'article_category'
    def __str__(self):
        return self.name

#blog article models
class Article(models.Model):
    STATUS = (
        (0,'on'),
        (1,'off')
    )
    #id = models.IntegerField(primary_key=True,help_text='primary key',auto_created=True)
    category = models.ForeignKey(Category,related_name='articles', help_text='foreigner key reference Category')
    #author = models.ForeignKey(myadmin.User, help_text='foreigner key reference myadmin User')
    title = models.CharField(max_length=100, help_text='article title')
    description = models.TextField(help_text='article brief description')
    content = models.TextField(help_text='article content')
    like = models.IntegerField(default=0,help_text='like numbers')
    secretcode = models.CharField(max_length=512,help_text='who has the code can scan')
    status = models.IntegerField(choices=STATUS,help_text='status of the article')
    createtime = models.DateTimeField(auto_now_add=True,help_text='time that first created')
    modifytime = models.DateTimeField(auto_now=True,help_text='time when modified')

    articles = models.Manager()

    def __str__(self):
        return self.title
    class Meta:
        db_table = 'article'

    def save(self, *args, **kwargs):
        if not self.id:
            Category.categories.filter(pk=self.category.pk).update(totalitems = F('totalitems')+1)
        super(Article,self).save(*args, **kwargs)

serializers.py:

#   Article catalog
class ArticleCatalogSerializer(serializers.ModelSerializer):
    category = serializers.StringRelatedField()
    articletags = serializers.StringRelatedField(many=True)
    covercolor = serializers.StringRelatedField()
    class Meta:
        model = Article
        fields = ('id', 'title', 'category', 'articletags', 'description', 'like', 'createtime', 'covercolor')

covercolor = serializers.StringRelatedField() 会导致错误:Article' object has no attribute 'covercolor 我改成这个:

更改了 serializers.py:

#   category serializer for ArticleCatalogSerializer for nested relationship
class CategoryNestedRelationshipSerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('covercolor',)

#   Article catalog
class ArticleCatalogSerializer(serializers.ModelSerializer):
    category = serializers.StringRelatedField()
    articletags = serializers.StringRelatedField(many=True)
    covercolor = CategoryNestedRelationshipSerializer(read_only=True)
    class Meta:
        model = Article
        ields = ('id', 'title', 'category', 'articletags', 'description', 'like', 'createtime', 'covercolor')

出现错误:

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

如何实现?

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    在您的编辑中,将您的 ArticleCatalogSerializer 更改为

    class ArticleCatalogSerializer(serializers.ModelSerializer):
        category = CategoryNestedRelationshipSerializer()
        class Meta:
            model = Article
    

    你会得到这种格式的输出

    {
    "id": 1,
    "category": {
    "covercolor": "#ffffff"
    },
    "title": "sa",
    "description": "bhjghj",
    "content": "sda",
    "like": 0,
    "secretcode": "77",
    "status": 0,
    "createtime": "2015-04-18T07:52:57.230110Z",
    "modifytime": "2015-04-18T07:52:57.230135Z"
    }
    

    如果您想要任何其他类别的列,您可以像这样包含在您的类别序列化程序中

    class CategoryNestedRelationshipSerializer(serializers.ModelSerializer):
        class Meta:
            model = Category
            fields = ('covercolor','name','description')
    

    【讨论】:

    • 这工作得很好。在模型中,如果您引用与关系模型相关的任何列,外键应该是入口,在前一种情况下,我只是引用返回其名称的类别外键,只有一列,如果有很多列,你应该在关系模型上查询它们,并使其成为嵌套关系并插入到文章中,这是一个数组。我想对了吗?
    • 拯救了我的一天...谢谢。
    【解决方案2】:

    StringRelatedField 将发出相关字段的字符串表示形式。

    要保持“平面”格式,您需要编写一个custom 字段。

    或者,如果您想包含对 Category 的一些引用,您需要 PrimaryKeyRelatedField 或 nest 相关模型。

    【讨论】:

    • 我改成covercolor = serializers.PrimaryKeyRelatedField(read_only=True)还是不行~
    • 啊,好吧,如果您要序列化文章模型,那将是因为封面颜色属性(它在相关类别中)。要保持“平面”格式,您需要编写一个自定义字段。
    • 我已经编辑了我的问题,看看,我哪里错了?
    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 2022-08-08
    • 2016-07-28
    • 2017-10-05
    • 2014-01-05
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多