Django根据字典过滤模型

15

如何使用字典而不是方法参数在Django模型上进行过滤? 这就是我现在所拥有的:

class StoreView(TemplateView):

    def get(self, request):

        # A bunch of gets
        sort = request.GET.get('sort')
        sort_price = request.GET.get('sort_price')
        sort_mfr_method = request.GET.get('mfr_method')

        # The params tpsort by
        sort_params = {}

        if sort is not None:
            sort_params['sort'] = sort

        if sort_price is not None:
            sort_params['sort_price'] = sort_price

        if sort_mfr_method is not None:
            sort_params['sort_mfr_method'] = sort_mfr_method

        # The Model Query
        design_list = models.Design.objects.filter(sort_params)

        # etc...

顺带问一下,有比我上面做的更好的设置字典值的方法吗?比如三元表达式,但可以使值不存在如果它是None?

sort_params['sort'] = sort if not None else ''

https://dev59.com/3XDYa4cB1Zd3GeqPEdC1 - Ciro Santilli OurBigBook.com
2个回答

32

您可以使用字典来传递关键字参数,如下所示:

models.Design.objects.filter(**sort_params)

没有内置的方法可以有条件地设置字典键,但如果您经常这样做,可以自己编写:

def set_if_not_none(mapping, key, value):
    if value is not None:
        mapping[key] = value

class StoreView(TemplateView):

    def get(self, request):

        # A bunch of gets
        sort = request.GET.get('sort')
        sort_price = request.GET.get('sort_price')
        sort_mfr_method = request.GET.get('mfr_method')

        # The params tpsort by
        sort_params = {}

        set_if_not_none(sort_params, 'sort', sort)
        set_if_not_none(sort_params, 'sort_price', sort_price)
        set_if_not_none(sort_params, 'sort_mfr_method', sort_mfr_method)

        # The Model Query
        design_list = models.Design.objects.filter(**sort_params)

1
那很出色!这是有道理的,因为.filter可能定义在附近:filter(*args,**kwargs)我只是从未意识到你可以做上面那个,太棒了!谢谢 - JREAM

12

以上答案是正确的,我建议一个更加高效的方法。

这里request.GET是一个QueryDict,只需要将其转换为字典即可,代码如下:

kwargs = dict(request.GET)

现在可以对其进行过滤了,代码如下:

models.Design.objects.filter(**kwargs)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接