使用M2M字段上的可选参数进行Django动态过滤

时间:2012-11-17 11:13:38

标签: django listview filtering m2m

我正在尝试使用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=2012year=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关系,我如何对标签进行相同的过滤?基本上我要检查标签值是否与M2M关系中的任何tag.name匹配。

1 个答案:

答案 0 :(得分:1)

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

在一般情况下,你试图解决的问题并不容易。