python - 自动计算属性字段的 Django 过滤器查询

标签 python django django-models

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.

最佳答案

不,您不能根据模型方法或属性执行查找。 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]

上面会给我 Order 对象的列表,在 days 列表中具有 expire 值。

关于python - 自动计算属性字段的 Django 过滤器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31658793/

相关文章:

javascript - 在 Polymer 中获取 XMLHttpRequest 的响应值

python - 指定 matplotlib 层的顺序

python - 不同的 Unicode 字符串编码相同

python - 如何使用查询集更新 django auth_user?

mysql - 如何使用不级联删除其子项的外键创建 Django 模型?

python - 当电子邮件正文中包含中文字符时,email.retr 检索奇怪的 =20 个字符

Django 登录尝试有时会默默地失败

Django 项目作为桌面应用程序 : how to?

python - Django 模板不显示我的所有参数

django - 使用 Haystack 时出现 ValueError : Signal receivers must accept keyword arguments (**kwargs).