首页 > 解决方案 > 过滤器链的任意深度

问题描述

我想选择有多个标签的文章;

url(r"^tagged/(?P<tags>[+]*\w+)$", views.tagged, name="tagged"),

该请求的行为类似于“article/tagged/python+django”

在views.py中,确定标签长度,找到符合条件的文章

def tagged(request, tags):
    tags = tags.split("+")
    if len(tags) == 1:
        articles = Article.objects
                          .filter(tags__name=tags[0])

     if len(tags) == 2:
        articles = Article.objects
                          .filter(tags__name=tags[0])
                          .filter(tags__name=tags[1])
    if len(tags) == 3:
        articles = Article.objects
                          .filter(tags__name=tags[0])
                          .filter(tags__name=tags[1]) 
                          .filter(tags__name=tags[2])

    if ...

倍数看起来很笨拙,我怎么能用一个通用函数来解决这个问题来处理任意长度的标签。

标签: pythondjango

解决方案


您可以使用for循环来一一应用标签:

def tagged(request, tags):
    tags = tags.split("+")
    articles = Article.objects.all()
    for tag in tags:
        articles = articles.filter(tags__name=tag)

推荐阅读