Django Tag 管理

2018-11-12

前言

对数据添加 Tag(标签)是一种常见的功能,Tags 使用简单高效的分类方式,由 Tag 生成的 Tag Cloud 更是一种酷炫的可视化方式。在 Django 中改如何添加 Tag 呢?我们不需要从头开始,直接使用现成的扩展包就可以了。

django-taggit

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

如果你同时也使用了 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 数组的形式,如:

["读书", "学习"]

filter

如何使用 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”。