2018-11-12
对数据添加 Tag(标签)是一种常见的功能,Tags 使用简单高效的分类方式,由 Tag 生成的 Tag Cloud 更是一种酷炫的可视化方式。在 Django 中改如何添加 Tag 呢?我们不需要从头开始,直接使用现成的扩展包就可以了。
django-taggit 为 Django 添加了标签管理功能。
Step1 首先安装包:pip3 install django-taggit
。
Step2 在 INSTALLED_APPS
中加入 "taggit"。
至此就安装完成了。
在 Models 中按照如下方式添加字段:
from django.db import models from taggit.managers import TaggableManager class Food(models.Model): # ... fields here tags = TaggableManager()
使用的 API 参考官方文档:
>>> apple = Food.objects.create(name="apple")
>>> apple.tags.add("red", "green", "delicious")
>>> apple.tags.all()
[<Tag: red>, <Tag: green>, <Tag: delicious>]
>>> apple.tags.remove("green")
>>> apple.tags.all()
[<Tag: red>, <Tag: delicious>]
>>> Food.objects.filter(tags__name__in=["red"])
[<Food: apple>, <Food: cherry>]
如果你同时也使用了 Restframework 扩展,需要一个扩展来对 taggit 进行支持,这个扩展包是 django-taggit-serializer。
Step1 pip3 install django-taggit-serializer
。
Step2 在 INSTALLED_APPS
中加入 taggit_serializer
。
至此就安装完成了。
在对应的 Serializers 中采用如下写法:
from taggit_serializer.serializers import (TagListSerializerField, TaggitSerializer) class YourSerializer(TaggitSerializer, serializers.ModelSerializer): tags = TagListSerializerField() class Meta: model = YourModel
再次 runserver,在 Restframework 的调试网页中即出现了标签的输入框,在其中我们可以添加标签了。
需要注意的是,在添加的时候必须以 JSON 数组的形式,如:
["读书", "学习"]
如何使用 Restframework 自动创建的 RESTFul API 进行 Tag 搜索呢?
有两种方法:
一种是直接使用 Restframework 自动生成的 API,结合 django-filter 进行搜索。这个方法由于我对这两个框架的内部原理还不熟悉,没有打通成功。
因此我暂时使用第二种方法,再创建一个 API 接口,专门用于 Tag 查询:
View:
class FindTags(generics.ListAPIView): serializer_class = ProjectSerializer lookup_url_kwarg = 'tag' def get_queryset(self): tag = self.kwargs.get(self.lookup_url_kwarg) return Project.objects.filter(tags__name__in=[tag])
url:
path('projects/tag/<str:tag>', views.FindTags.as_view())
网络资料:
至此,我们的 Web App 中就具备 Tag 管理的功能了。我们自己一共没写两行代码,就获得了一个稳定可靠、功能全面的标签功能。这说明了 Python、Django 开发的高效率,也印证了那句名言:“人生苦短,我用 Python”。