我有一个模型,定义如下:
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
的作用,我希望将其保持干燥。
答案 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))