Django查询结合了fi中的两个不同情况

2024-09-26 18:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是django1.10

我有一个查询,它取决于接收到的参数—它取决于“job\u 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
    )

有这样的选择吗


Tags: tonamefromnonedateobjectsjobsjob
3条回答

我认为func需要将jobs返回到delete值

我能想到的最短(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语句来缩短编写的代码,并保持所有内容的可读性和简单性

您可以编写查询

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)

您可以将filter参数作为字典传递,这样您就只需要一个filter调用,然后在filter调用中解压字典。像这样:

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)

相关问题 更多 >

    热门问题