Django:如何按0-3标准过滤DB记录?

时间:2017-04-18 10:43:03

标签: python django

我的目标是拥有一个搜索表单(目前有3个字段,但后来可能还有更多字段)可用于过滤产品(在我的情况下,产品为training,可以按{{1}过滤},sportprovince)。所有这些过滤字段都是可选的,所以我想忽略POST值是citysport是相关表格的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个参数它已经有很多不同的选项,所以我怀疑这是我计划稍后添加更多过滤器的方式

有什么建议吗?这对我来说似乎有点琐碎的任务,但到目前为止,我无法谷歌正确的解决方案:(

2 个答案:

答案 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