自动计算属性字段的Django筛选器查询

2024-05-10 01:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个Django订单模型,属性字段自动计算。如何进行筛选查询。

class Order(models.Model):

    @property
    def expire(self):
        return self.created + datetime.timedelta(days=self.days_left())

    @property
    def days_left(self):
        return self.recurrence_period  * self._recurrence_unit_days[self.recurrence_unit]

从今天开始计算1,3,7天

settings.SUBSCRIPTION_EXPIRATION_REMIND = [1, 3, 7]

days = map(lambda x: datetime.date.today() + datetime.timedelta(days=x), settings.SUBSCRIPTION_EXPIRATION_REMIND)

[datetime.date(2015, 7, 28),
 datetime.date(2015, 7, 30),
 datetime.date(2015, 8, 3)]

如何按ORM查询过滤

Order.objects.filter(expire__in=days)

Django正在抛出错误。

FieldError: Cannot resolve keyword 'expire' into field.

Tags: djangoselfdatetimedatereturnsettingsdefunit
3条回答

我不认为你可以像文档所说的那样在字段查找中使用属性The field specified in a lookup has to be the name of a model fieldhttps://docs.djangoproject.com/en/1.8/topics/db/queries/#field-lookups

最后将expire添加到模型,计算save方法的值。现在我可以了

 Order.objects.filter(expire__in=days)

不,不能基于模型方法或属性执行查找。Django ORM不允许这样做。

查询被编译为SQL,在数据库级别发送和处理,而属性是Python代码,数据库对此一无所知。这就是为什么Django过滤器只允许我们使用数据库字段的原因。

可以做到:

Order.objects.filter(created=..) # valid as 'created' is a model field

不能这样做:

Order.objects.filter(expires=..) # INVALID as 'expires' is a model property

相反,您可以使用列表理解来获得所需的结果。

[obj for obj in Order.objects.all() if obj.expire in days]

上面将给出在days列表中具有expire值的Order对象的列表。

相关问题 更多 >