2012-10-30 175 views
1

我可以根据模型字段的选项筛选查询集吗?Django高级筛选

型号:

COLORS = (
    ('BLACK', 'black'), 
    ('RED', 'red'), 
    ('BLUE', 'blue'), 
    //etc.. 
) 

class Thing(Models.model): 
    color = models.CharField(max_length=5, choices=COLORS) 

观点:

def filter_by_color(request): 
    q = Thing.objects.filter(???) 

有没有办法根据不同的颜色选择过滤Thing?另外,是否有办法动态编写这些内容,以便所有颜色选择都可以响应单个视图?

回答

1

你想要这个吗?

视图

def filter_by_color(request, color): 
    q = Thing.objects.filter(color=color) 

所以,当你访问http://yoursite/thisview/black你会得到Thing s的黑色,当您访问http://yoursite/thisview/red你会得到Thing s的红色。

+0

这是非常有帮助的。但是如果你想要在一个url中包含所有的颜色选择'http:// yoursite/thisview /'并过滤那个视图中的颜色选择,那么每次用户选择不同的颜色时你是否需要使用ajax来修改你的查询集?似乎会有更好的方式... –

+0

@NickB对不起,我没有得到你想说的和实现。 – Rohan

+0

我只是说:有没有办法过滤一个查询集,而不必访问不同的网址?那么用户不必刷新页面?感谢您的想法! –

3

你应该看看Q对象。这可以帮助您构建复杂的OR查询,具体取决于用户选择过滤的颜色。

UPDATE添加一个示例。

假设你想在一个以上的彩色滤光片:

from django.db.models import Q 

def filter_by_color(request): 

    q = Thing.objects.filter(Q(color="BLACK") | Q(color="RED)) 

更新2如果用户使用复选框选择颜色或类似的,你可以使用这种方法:

def filter_by_color(request): 
    selected_colors = request.GET.getlist('colors') 

    q = Thing.objects.filter(color__in=selected_colors) 
+0

嗨Mikael。你能举个例子说明在这种情况下如何使用Q对象吗?感谢您的想法! –

+0

嗨,尼克,我已经添加了一个例子。你打算如何将选定的颜色从客户端传递到视图? – Mikael