如果未设置request.get()参数,则过滤

时间:2016-05-17 21:00:16

标签: django django-models django-views django-filter

我试图做简单的django过滤器。

这是我的代码行进行过滤:

cars = models.CarForRent.objects.filter(car_in_city=request.GET.get('city')).filter(travel_abroad=request.GET.get('travel_abroad'))

现在它只有在设置了所有参数后才有效。如果我提交空白的request.GET.get(' city')或空白的request.GET.get(' travel_abroad')参数则返回none。

如果request.GET.get(' city')为空,如何返回所有城市中的所有项目?

当然,我可以为每个get参数编写if,但它必须更加方便。

3 个答案:

答案 0 :(得分:2)

首先,您可以通过导入要过滤的模型来提高代码的可读性:

from models import CarForRent

如果您正在进行手动过滤,则必须使用ifs。

city = request.GET.get('city')
travel_abroad=request.GET.get('travel_abroad')
cars = CarForRent.objects.all()

if city:
    cars = cars.filter(car_in_city=city)
if travel_abroad:
    cars = cars.filter(travel_abroad=travel_abroad)

替代方法是使用允许空白参数的https://github.com/carltongibson/django-filter之类的东西。

答案 1 :(得分:1)

如果你有很多字段,那么在循环中进行过滤可能是值得的:

cars = models.CarForRent.objects.all()
for fieldname in ['city', 'travel_abroad', ...]:
    if request.GET.get('fieldname'):
        cars = cars.filter(**{fieldname: request.GET[fieldname]})

如果你只有几个字段,那么一些if语句可能是最简单的。

答案 2 :(得分:1)

IMO,the Q object在这种情况下可用于过滤。

from django.db.models import Q

city = request.GET.get('city')
travel = request.GET.get('travel_abroad')

q = Q()
if city:
    q &= Q(car_in_city=city)
if travel:
    q &= Q(travel_abroad=travel)

qryset = CarForRent.objects.filter(q)

您也可以使用OR操作代替AND。