我有以下型号:
class Process(models.Model):
title = models.Charfield(max_length=255)
date_up = models.DateTimeField(auto_now_add=True)
days_activation = models.PositiveSmallIntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)
现在我需要Process根据它们的值来查询已过期的所有对象days_activation.
我试过了
from datetime import datetime, timedelta
Process.objects.filter(date_up__lte=datetime.now()-timedelta(days=F('days_activation')))
Run Code Online (Sandbox Code Playgroud)
并收到以下错误消息:
TypeError:timedelta days组件的不支持类型:F
我当然可以用Python做到这一点:
filter (lambda x: x.date_up<=datetime.now() - timedelta(days=x.days_activation),
Process.objects.all ()),
Run Code Online (Sandbox Code Playgroud)
但我真的需要制作一个django.db.models.query.QuerySet.
F是深黑色的姜戈魔法,遇到它的物体必须属于适当的魔法阵才能处理它。
就您而言,django.db.models.query.filter知道F,但datetime.timedelta不知道。因此,您需要将 排除F在参数列表之外timedelta。幸运的是, 的乘法timedelta * int受 的支持F,因此以下代码可以工作:
Process.objects.filter(date_up__lte=datetime.now()-timedelta(days=1)*F('days_activation'))
Run Code Online (Sandbox Code Playgroud)
事实证明,这适用于 PostgreSQL,但不适用于 SQlite (Django 1.11 仅支持+和-for timedelta,可能是因为相应的 SQlite 限制)。
| 归档时间: |
|
| 查看次数: |
2739 次 |
| 最近记录: |