【问题标题】:Django Advanced FilteringDjango 高级过滤
【发布时间】:2023-04-08 14:14:01
【问题描述】:

我可以根据模型字段的选择过滤查询集吗?

型号:

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?另外,有没有办法动态编写,以便所有颜色选择都可以响应单个视图?

【问题讨论】:

    标签: django view filter django-queryset


    【解决方案1】:

    您应该查看Q 对象。这可以帮助您根据用户选择过滤的颜色构建复杂的 OR 查询。

    更新添加示例。

    假设您要过滤不止一种颜色:

    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)
    

    【讨论】:

    • 嗨,米凯尔。你能举个例子说明在这种情况下如何使用 Q 对象吗?感谢您的想法!
    • 嗨,尼克,我添加了一个示例。您打算如何将选定的颜色从客户端传递到视图?
    【解决方案2】:

    你想要这个吗?

    查看

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

    因此,当您访问http://yoursite/thisview/black 时,您将获得黑色的Things,当您访问http://yoursite/thisview/red 时,您将获得红色的Things。

    【讨论】:

    • 这很有帮助。但是,如果您想在单个 url http://yoursite/thisview/ 中包含所有颜色选择并过滤该视图中的颜色选择,您是否需要在每次用户选择不同颜色时使用 ajax 来修改您的查询集?好像有更好的办法……
    • @NickB 很抱歉,我没有得到您想要表达和实现的目标。
    • 我的意思是:有没有办法以不同的方式过滤查询集而无需访问不同的 url?所以用户不必刷新页面?感谢您的想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多