我有以下情况。我有一个包含3个字段的表单,使用POST方法提交。然后捕获字段并在数据库上使用Q进行搜索:
query = Model.objects.filter( Q(field1=field1) & Q(field2=field2) & Q(field3=field3))
问题在于我想动态使用填充的字段而不是空字段。这意味着查询将包含一个或两个或三个标准,具体取决于用户。
我已设法执行我用嵌套if
描述的搜索,但考虑添加额外的字段,它会变得越来越大。
谢谢
答案 0 :(得分:0)
您可以编写通用函数,以根据传入的字段生成查询。
def generate_query(**kwargs):
query = Q()
for database_field, value in kwargs.items():
query_dict = {database_field:value}
if value:
query &= Q(**query_dict)
return query
并使用它:
data = {"name":"john", "age__gte":25} # your post data
query = generate_query(**data)
objects = SomeModel.objects.filter(query)
# generally: SomeModel.objects.filter(request.POST)
答案 1 :(得分:0)
考虑您有如下的查询字段:
field = {'field1': 'value1', 'field2': 'value2', 'field3': None}
您可以过滤以删除空字段,如下所示:
non_empty_field = dict(filter(lambda x: x[1], field.items())) # output: {'field1': 'value1', 'field2': 'value2'}
对于执行和查询,您可以写
Model.objects.filter(**non_empty_field) # equivalent to Model.objects.filter(field1='value1', field2='value2')
执行和查询您不需要Q()对象
对于执行或查询,您可以写:
Model.objects.filter(eval('|'.join(['(Q({}="{}"))'.format(i,j) for i,j in non_empty_field.items()])))
根据上面的field
示例,查询将等同于:
Model.objects.filter(Q(field1=value1) | Q(field2=value2))