使用带有DateTimeFields的F()表达式的Django注释

时间:2018-03-07 15:22:46

标签: django django-queryset django-annotate

我想为具有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的教程,将非常感谢)

0 个答案:

没有答案