1

我想为具有 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 的教程将不胜感激)

4

0 回答 0