我正在尝试做一个 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=food
。year=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.name
M2M 关系中的任何一个匹配。
再见