如何将计算字段添加到 Django 查询表达式
How to add a calculated field to a django query expression
我有一个 Django 模型,DocumentComments
,有两个日期时间字段,created
和 updated
。我正在研究一个搜索函数,该函数解析搜索字符串和 returns Q 表达式以根据搜索字符串中的值查询 DocumentComments
模型。
我需要写类似 Q(created.year=xxxx)
的内容,其中 created.year
是 created
日期时间字段中的年份。但是 Django 整个上午都在告诉我“关键字不能是表达式”。
我尝试使用自定义模型管理器并使用年份字段注释默认查询集,但这没有用,因为我似乎无法访问 get_queryset
函数中的 created.year
值.
class DocumentCommentManager(models.Manager):
def get_queryset(self):
c_year = self.created.year
u_year = self.updated.year
return super(DocumentCommentManager, self).get_queryset().annotate(created_year=c_year, updated_year=u_year)
我错过了什么,或者实现目标的更好方法是什么?
谢谢!
马克
我能够使用 Django 的数据库函数 Extract (https://docs.djangoproject.com/en/3.1/ref/models/database-functions/#extract)
解决我的问题
我的 DocumentCommentManager:
from django.db.models.functions import Extract
class DocumentCommentManager(models.Manager):
def get_queryset(self):
return super(DocumentCommentManager, self).get_queryset().annotate(created_year=Extract("created","year"))
这解决了我最初向模型查询添加计算日期时间字段的问题。
我仍然没有找到使用 Q 表达式将计算字段添加到模型查询的通用方法。如果你能分享任何例子,那就太好了!
我有一个 Django 模型,DocumentComments
,有两个日期时间字段,created
和 updated
。我正在研究一个搜索函数,该函数解析搜索字符串和 returns Q 表达式以根据搜索字符串中的值查询 DocumentComments
模型。
我需要写类似 Q(created.year=xxxx)
的内容,其中 created.year
是 created
日期时间字段中的年份。但是 Django 整个上午都在告诉我“关键字不能是表达式”。
我尝试使用自定义模型管理器并使用年份字段注释默认查询集,但这没有用,因为我似乎无法访问 get_queryset
函数中的 created.year
值.
class DocumentCommentManager(models.Manager):
def get_queryset(self):
c_year = self.created.year
u_year = self.updated.year
return super(DocumentCommentManager, self).get_queryset().annotate(created_year=c_year, updated_year=u_year)
我错过了什么,或者实现目标的更好方法是什么?
谢谢!
马克
我能够使用 Django 的数据库函数 Extract (https://docs.djangoproject.com/en/3.1/ref/models/database-functions/#extract)
解决我的问题我的 DocumentCommentManager:
from django.db.models.functions import Extract
class DocumentCommentManager(models.Manager):
def get_queryset(self):
return super(DocumentCommentManager, self).get_queryset().annotate(created_year=Extract("created","year"))
这解决了我最初向模型查询添加计算日期时间字段的问题。
我仍然没有找到使用 Q 表达式将计算字段添加到模型查询的通用方法。如果你能分享任何例子,那就太好了!