gpt4 book ai didi

django - 如何使用 F() 对象在 Django ORM 中执行此操作?

转载 作者:行者123 更新时间:2023-12-04 14:31:33 24 4
gpt4 key购买 nike

我遇到过这样的模型:

class Task(models.Model):
timespan = models.IntegerField(null=True, blank=True)

class Todo(models.Model):
limitdate = models.DateTimeField(null=True, blank=True)
task = models.ForeignKey(Task)

我需要提取所有 Todoslimitdate小于或等于今天的日期 + 相关 Task 中定义的时间跨度模型。

类似(虚拟示例):
today = datetime.datetime.now()
Todo.objects.filter(limitdate__lte=today + F('task__timespan'))

现在,我可以用循环来做到这一点,但我正在寻找一种方法来用 F() 来做到这一点。 ,我找不到一个。

我开始怀疑我是否可以用 F() 做到这一点.也许我应该使用 extra ?

请注意,我不能随意更改型号代码。

最佳答案

主要问题是 DB 不支持 date + integer并且很难将 ORM 查询写入 date + integer::interval , 以 PostgreSQL 为例,其中 integertask_timespan 的值列,以天为单位。

然而,作为limitdate <= today + task__timespan等于limitdate - today <= task__timespan
我们可以将查询转换为
Todo.objects.filter(task__timespan__gte=F('limitdate') - today).distinct()
因此 SQL 变得类似于 integer >= date - date ,这应该在 PostgreSQL 中工作,因为 date - date输出 interval可以与 integer 进行比较天数。

在其他数据库(如 Sqlite)中,这很复杂,因为需要使用 julianday() 来转换日期。起初......我认为你需要和extra()一起玩甚至 raw()获取正确的 SQL。

此外,正如 Chris Pratt 所建议的,如果您可以在所有相关字段中使用时间戳,则查询任务可能会变得更容易,因为加减运算的限制较少。

附言我现在没有 env 来验证它,你可以先尝试一下。

关于django - 如何使用 F() 对象在 Django ORM 中执行此操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12457119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com