Python Django查询-在筛选器中组合两种不同的情况
我正在使用Django 1.10 我有一个查询,它取决于收到的参数-它取决于“job_name”是否为None:Python Django查询-在筛选器中组合两种不同的情况,python,django,django-queryset,django-filter,Python,Django,Django Queryset,Django Filter,我正在使用Django 1.10 我有一个查询,它取决于收到的参数-它取决于“job_name”是否为None: def delete_jobs_by_age_and_name(days_ago, job_name=None): date_to_delete_from = datetime.today() - timedelta(days=days_ago if job_name is not None: jobs_to_delete = AsyncJob.o
def delete_jobs_by_age_and_name(days_ago, job_name=None):
date_to_delete_from = datetime.today() - timedelta(days=days_ago
if job_name is not None:
jobs_to_delete = AsyncJob.objects.filter(
name=job_name,
created_at__lte=date_to_delete_from
)
else:
jobs_to_delete = AsyncJob.objects.filter(created_at__lte=date_to_delete_from)
我想在一个查询中这样做。例如:
job_name = ANY if job_name is None
jobs_to_delete = AsyncJob.objects.filter(
name=job_name,
created_at__lte=date_to_delete_from
)
有这样的选项吗?您可以组合查询
jobs_to_delete = AsyncJob.objects.filter(created_at__lte=date_to_delete_from)
if job_name is not None:
jobs_to_delete = jobs_to_delete.filter(name=job_name)
我认为func需要将作业返回到删除值 我能想到的最短(2行)的方法是:
jobs_to_delete = AsyncJob.objects.filter(created_at__lte=date_to_delete_from)
return jobs_to_delete.filter(name=job_name) if job_name else jobs_to_delete
通过这种方式,您可以使用“inline”if语句来缩短编写的代码,并保持所有内容的可读性和简单性您可以将
过滤器
参数作为字典传递,您可以事先修改它,这样您只需要一个过滤器
调用,然后只需在过滤器
调用中解压缩字典即可。大概是这样的:
filter_kwargs = {'created_at__lte': date_to_delete_from}
if job_name is not None:
filter_kwargs['name'] = job_name
jobs_to_delete = AsyncJob.objects.filter(**filter_kwargs)
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。A通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请在你的回答中添加一些解释,包括你所做的假设。好主意。谢谢。我正在寻找只运行一次查询的方法。谢谢这只运行一次查询。QuerySet是惰性的,filter()实际上不执行任何数据库调用。