我的目标是拥有一个搜索表单(目前有3个字段,但后来可能还有更多字段)可用于过滤产品(在我的情况下,产品为training
,可以按{{1}过滤},sport
和province
)。所有这些过滤字段都是可选的,所以我想忽略POST值是无(city
和sport
是相关表格的FK)还是空字符串(province
)。
我需要将这三个条件链接到city
调用,但是我需要省略实际上没有使用的条件。我还需要检查无值,因为我收到Training.objects.filter()
例外。
这是我到目前为止所做的,但它并不好(只有当所有3个条件都正确填充时):
RelatedObjectDoesNotExist
我尝试在trainings = Training.objects.filter(sport = searchQuery.sport.sport_id).filter(province = searchQuery.province.province_id).filter(city = searchQuery.city)
中使用条件表达式以避免异常,但要么我无法正确详细说明语法,要么不可能 - 我被无效的语法错误阻止了......
我甚至考虑在IF子句中检查输入的哑检测并对每种情况有不同的查询,但即使有3个参数它已经有很多不同的选项,所以我怀疑这是我计划稍后添加更多过滤器的方式
有什么建议吗?这对我来说似乎有点琐碎的任务,但到目前为止,我无法谷歌正确的解决方案:(
答案 0 :(得分:1)
Django Queryset是延迟加载的,因此跟随不是它的问题
trainings = Training.objects.filter(sport = searchQuery.sport.sport_id)
if something:
trainings = trainings.filter(province = searchQuery.province.province_id)
根据过滤器变量的状态,您不需要每个单独的选项。
你也可以通过捕捉异常
来做到这一点答案 1 :(得分:1)
例如,您可以有条件地应用过滤器:
trainings = Training.objects.all()
if searchQuery.sport:
trainings = trainings.filter(sport=searchQuery.sport)
if searchQuery.province:
trainings = trainings.filter(province=searchQuery.province)
if searchQuery.city:
trainings = trainings.filter(city=searchQuery.city)
for training in trainings: # this will be the point where the actual database call occurs
# do something