Skip to main content
 首页 » 编程设计

python之如何在 Django-rest-framework 序列化程序的关系模型中获得额外的列

2024年08月26日28lvdongjie

我有 Category 和 Article 模型,Article 有一个外键引用 Category,在我的 serializer 由于 __str__ 方法,我可以获取类别模型中的名称列,但是如何获取 Category 模型中的其他列

模型.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) 

序列化程序.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'. 

如何实现?

请您参考如下方法:

在您的编辑中,将您的 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" 
} 

如果你想要 category 的任何其他列,你可以像这样在你的 category 序列化器中包含

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