我想在DJango ORM查询电话中获得每月总和的回复:
models.Subscription.objects.all().extra(select={'Month': "EXTRACT(Month FROM Modified)"}).annotate(count_items=Count('Modified'))
我的模型是这样的:
class Subscription(models.Model):
SType = (
('C', 'Civilian'),
('E', 'Enlisted'),
('O', 'Officer'),
)
Subscription_Type = models.CharField(max_length=1, choices=SType)
Lifetime = models.BooleanField(default=False)
Member = models.ForeignKey(Member)
Modified = models.DateField()
objects = SubscriptionManager()
def __str__(self):
return self.Member.first_name + " " + self.Member.last_name + ": " + self.Subscription_Type + "; last modified: " + self.Modified.strftime('%Y-%m-%d')
我正在运行Postgres数据库背景,并确认列“已修改”。
但是,当我运行查询时出现此错误:
File "/home/arcee123/.local/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column "modified" does not exist
LINE 1: SELECT (EXTRACT(Month FROM Modified)) AS "Month", "ifthq_sub...
我忘记了什么吗?我正在尝试获取每个月的记录数。感谢。
答案 0 :(得分:0)
您是否尝试过查看架构?我认为你的列名错了。
假设您正在使用Djnago> = 1.8,您还可以通过编写像这样的Func
来避免整个问题:
class ExtractMonth(Func):
template = "EXTRACT(MONTH FROM %(expressions)s)"
def __init__(self, *expressions, **extra):
extra['output_field'] = SmallIntegerField()
super().__init__(*expressions, **extra)
并像这样使用它:
Subscription.objects.annotate(Month=ExtractMonth('Modified'))\
.values('Month').annotate(Count('Month'))
这种方式'Modified'
是模型上字段的名称,Django会为您解析列名。
this 1.9 ticket中提出了一种更通用的解决方案。