我正在尝试使用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关系,我如何对标签进行相同的过滤?基本上我要检查标签值是否与M2M关系中的任何tag.name
匹配。
侨
答案 0 :(得分:1)
我强烈建议您使用django-filter,或者查看它是如何做的。本质上,它采用表单输入,并使用从表单传入的参数构建查询集。
在一般情况下,你试图解决的问题并不容易。