Django Drf序列化django-taggit问题

发布时间:2021-01-05 浏览量: 105 文章分类: python

在结合DRF序列化文章内容的同时,想渲染出文章的标签内容,提供给前台展示。 先看看数据库结构

    title = models.CharField(max_length=30,verbose_name='标题')
    create_time = models.DateTimeField(auto_now_add=True,verbose_name='发布时间')
    cover_img_url = models.URLField(verbose_name='封面图片地址')
    ification = models.ForeignKey('NewsClassIfication',on_delete=models.CASCADE,verbose_name='文章分类')
    tags = TaggableManager(verbose_name='标签') # 注意这里
    content = models.TextField(verbose_name='正文')
    visitors = models.BigIntegerField(verbose_name='访问量',default=0)

序列化器样式如下:

class AdminNewsSerializers(serializers.ModelSerializer):
    class Meta:
        model = news_models.NewsModels
        fields = '__all__'
        depth = 1

我发现返回前端的数据中缺少了tags的标签内容,而django-taggit内部实际是依托于ManyToManyField多对多方式实现的。而我在增加了depth参数的数值发现也没有用。其实不想在一个外部模块上浪费很多的时间。既然他不支持,那简单一点,直接使用drfSerializerMethodField自己实现就好了。继续进行如下改造。

class AdminNewsSerializers(serializers.ModelSerializer):
    tags = serializers.SerializerMethodField()
    class Meta:
        model = news_models.NewsModels
        fields = '__all__'
        depth = 1
    def get_tags(self,row):
        tag_list = []
        for tag in row.tags.all():
            tag_list.append(tag.name)
        return tag_list

这样就已经实现了最基础的展示,当然如果需要其他的格式,也可以在进行改造。

备注一下 django-taggit的一些常规使用 + 获取相关的全部标签 tags.all() + 给对应的文章写入标签 article_obj.tags.add("python","drf","taggit") + 给对应的文章删除标签 article_obj.remove("python") + 查找包含某个标签的所有文章 Article.objects.filter(tags__name__in=['python'])