Django动态过滤与M2M领域的optiona参数

问题描述:

我想做一个ListView接受可选参数作为查询集的过滤器使用。Django动态过滤与M2M领域的optiona参数

现在,我已经我的模型:

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

URL(R '^出版物/(P *)/?',PublicationList.as_view (),名称=“出版物清单”),

的想法是publications后可选参数追加,像 year=2012year=2012&tags=foodyear=2012&tags=food,car&authors=bobby 这样的东西,给我FR eedom在做过滤。 顺便说一句,这是正确/标准的方式来通过网址传递多个参数?

现在,我这的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匹配。

我强烈建议或者使用django-filter,或考虑看看它是如何做的事情一样。本质上它需要表单输入,并使用从表单传入的参数构建查询集。

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

+0

你知道这个的一个运行的例子吗?我试图理解它究竟做了什么。 – EsseTi

+0

或多或少与django admin相同。它像这样配置URL:http://www.domain.com/view/?relatedmodel__field = blah&field = yes&otherrelatedmodel__field = something'并且查询参数直接传递给一个'filter'作为kwargs –

+0

Josh,难道你不知道如果这个应用程序使用_exactly_与django管理应用程序相同的代码? –