我想为具有 DateTimeField("installed_date" field) 和 IntegerField ("expiration_days") 的模型编写自定义 QuerySet 和 Manager,并且我想根据规则“'installed_date'加上'expiration_days'过滤对象在当天之前”,以便获取当前到期的对象。
例如:
import datetime as dt
from django.db import models
from django.db.models import F, Func, ExpressionWrapper, DateField, IntegerField, FloatField
from django.utils import timezone
class MyQuerySet(models.QuerySet):
def obsolete(self):
current_date = timezone.localtime(timezone.now())
obsolete_qs = self.annotate(
days_since_installed_date = ExpressionWrapper(
F('installed_date')-current_date, output_field='IntegerField'
)
).filter(
days_since_installed_date__lt=F('expiration_days')
)
return obsolete_qs
class MyManager(models.Manager):
def get_queryset(self):
return MyQuerySet(self.model, using=self._db)
def obsolete(self):
return self.get_queryset().obsolete()
class MyModel(models.Model):
description = models.CharField(max_length=100)
installed_date = models.DateTimeField(default=timezone.now)
expiration_days = models.PositiveIntegerField()
obsolete = MyManager()
@property
days_since_installed_date = installed_date - timezone.now()
像以前一样尝试时,我得到错误“'str'对象没有属性'get_lookup'”
也试过这个:
class MyQuerySet(models.QuerySet):
def obsolete(self):
current_date = timezone.localtime(timezone.now())
obsolete_qs = self.annotate(
days_since_installed_date = F('installed_date')-current_date
).filter(
expiration_days__gt=days_since_installed_date
)
return obsolete_qs
在这里我得到“名称'days_since_installed_date'未定义”。如果我将“days_since_installed_date”封装在前面代码的过滤器部分内的 F() 表达式中,我会得到“运算符不存在:整数 > 间隔”。
而且我一直在尝试基于 StackOverflow 答案的更多食谱,但仍然遇到各种错误。
我正在使用 Python 3.5、Django 1.11 和 Postgres。
任何人都可以提出一种方法吗?
(另外,如果有人可以参考有关根据日期查询 django db 的教程将不胜感激)