1

我正在尝试做一个 ListView 接受可选参数以用作查询集的过滤器。

现在,我有我的模型:

class Author(models.Model):
    name = models.CharField(max_length=100, default='')
    surname = models.CharField(max_length=100, default='')

    def __unicode__(self):
        return "%s %s" % (self.name,self.surname)

class Tag(models.Model):
    name = models.CharField(max_length=100, default='')


    def __unicode__(self):
        return "%s" % (self.name)


class Publication(models.Model):
    title = models.CharField(max_length=100, default='')
    authors = models.ManyToManyField(Author,blank=True, null=True)
    conf = models.CharField(max_length=100, default='')
    year = models.IntegerField(default=0)
    tags = models.ManyToManyField(Tag,blank=True, null=True)

    def __unicode__(self):
        return "%s" % (self.title)

我以这种方式映射了网址

url(r'^publications/(?P.*)/', PublicationList.as_view(), name='publication-list'),

这个想法是在 之后附加可选参数publications,类似 year=2012或 这样的东西让我可以自由地进行过滤year=2012&tags=foodyear=2012&tags=food,car&authors=bobby顺便说一句,这是通过 url 传递多个参数的正确/标准方式吗?

现在,我有这个 ListView 类

class PublicationList(ListView):
template_name = 'publications.html'
context_object_name='pubs'

def get_queryset(self):
    ...

self.kwargs['optional']我可以得到参数的完整字符串。但是:我是否必须对数据进行所有案例才能进行过滤?那么在结果列表()上进行拆分,然后在结果列表(args)上执行一个for并检查每个值(arg),如果它是年份(arg=='year')然后做filter(year=arg)

有什么可以为我做这件事或更好的事情吗?

此外,由于我与标签和作者有 m2m 关系,例如,我如何对标签进行相同的过滤?基本上我必须检查标签值是否与tag.nameM2M 关系中的任何一个匹配。

再见

4

1 回答 1

1

我强烈建议使用django-filter,或者看看它是如何工作的。本质上,它接受表单输入,并使用从表单传入的参数构建查询集。

在一般情况下,您要解决的问题并不容易。

于 2012-11-17T11:20:54.637 回答