Django - 基于模型方法的过滤器

时间:2014-06-05 02:20:43

标签: django

我有一个模型,定义如下:

class Item(models.Model):
    name = models.CharField(max_length=200, null=True, default='', blank=True)
    creation_date = models.DateTimeField('date created', default=timezone.now())

    def was_published_today(self):
        today = timezone.now() - datetime.timedelta(days=1)
        return self.creation_date >= today

我想像这样过滤一组Item:

items = Item.objects.filter(was_published_today=True)

但是我遇到了一个FieldError,这是有道理的,因为看起来过滤器不是基于方法过滤一组对象。详细错误:

Cannot resolve keyword 'was_published_today' into field. Choices are : creation_date, name

这样做的正确方法是什么?我知道我可以将creation_date与今天的日期进行比较,但这就是was_published_today的作用,我希望将其保持干燥。

2 个答案:

答案 0 :(得分:2)

您可以在这里使用django Managers

自定义管理器:

class GetPublishedToday(models.Manager):
      def get_query_set(self):
        return super(GetPublishedToday, self).get_query_set().filter(creation_date= timezone.now() - datetime.timedelta(days=1))
模特中的

class Item(models.Model):
    name = models.CharField(max_length=200, null=True, default='', blank=True)
    creation_date = models.DateTimeField('date created', default=timezone.now())
    was_published_today= GetPublishedToday()

在观点中:

items = Item.was_published_today.all()  # or .filter(name= "foobar")

''' PS:这是一个未经测试的代码。'''

答案 1 :(得分:0)

我认为

F expressions是正确的方法。文档示例:

from datetime import timedelta
Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))