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
参数的数值发现也没有用。其实不想在一个外部模块上浪费很多的时间。既然他不支持,那简单一点,直接使用drf
的SerializerMethodField
自己实现就好了。继续进行如下改造。
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'])