Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询-在筛选器中组合两种不同的情况_Python_Django_Django Queryset_Django Filter - Fatal编程技术网

Python Django查询-在筛选器中组合两种不同的情况

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

我正在使用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.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()实际上不执行任何数据库调用。