【问题标题】:Django query - combine two different cases in filterDjango查询 - 在过滤器中结合两种不同的情况
【发布时间】:2019-01-14 06:29:12
【问题描述】:

我正在使用 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
    )

有这样的选择吗?

【问题讨论】:

    标签: python django django-queryset django-filter


    【解决方案1】:

    我认为 func 需要返回 jobs_to_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 
    

    这样您就可以使用“内联”if 语句来缩短编写的代码并保持一切可读性和简单性

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并且会使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案2】:

    您可以将 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)
    

    【讨论】:

    • 好主意。谢谢。
    【解决方案3】:

    您可以编写查询。

    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() 实际上并不执行任何数据库调用。
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2022-11-08
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多