我想为具有DateTimeField(" installed_date"字段)和IntegerField(" expiration_days")的模型编写自定义QuerySet和Manager,我想过滤对象根据规则" ' installed_date'加上“到期日”'是在当天之前"所以要获得当前到期的对象。
例如:
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
我在这里得到了#34; days_since_installed_date'未定义"。如果我封装了' days_since_installed_date'在前一代码的过滤器部分内的F()表达式中我得到"运算符不存在:整数>间隔"
我一直在尝试基于StackOverflow答案的更多食谱,但仍然会遇到各种错误。
我使用的是Python 3.5,Django 1.11和Postgres。
有人可以建议一种方法吗?
(另外,如果有人可以参考基于日期查询django db的教程,将非常感谢)