我试图做简单的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,但它必须更加方便。
答案 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。