我有一个类似于以下的模型:
class Review(models.Model):
venue = models.ForeignKey(Venue, db_index=True)
review = models.TextField()
datetime_created = models.DateTimeField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)
我想查询数据库以获得按天分组的场地的评论总数.MySQL查询将是:
SELECT DATE(datetime_created), count(id)
FROM REVIEW
WHERE venue_id = 2
GROUP BY DATE(datetime_created);
Run Code Online (Sandbox Code Playgroud)
在Django中实现这一目标的最佳方法是什么?我可以用
Review.objects.filter(venue__pk=2)
Run Code Online (Sandbox Code Playgroud)
并在视图中解析结果,但这对我来说似乎不对.
我的问题与这篇文章几乎完全相同,只是我使用的是Python和Django而不是PHP.
任务是采取:
id date
1 2009-01-01 10:15:23
2 2009-01-01 13:21:29
3 2009-01-02 01:03:13
4 2009-01-03 12:20:19
5 2009-01-03 13:01:06
Run Code Online (Sandbox Code Playgroud)
并输出:
2009-01-01
1
2
2009-01-02
3
2009-01-03
4
5
Run Code Online (Sandbox Code Playgroud)
我可以通过循环排序日期并在我的python视图文件中将HTML输出到一个字符串来手动破解某些东西,但我想知道:有更好的方法使用Django模板或漂亮的Python功能吗?
如何在不使用额外的情况下按月计算总数?
我目前正在使用:
例.
到目前为止我尝试过的.
#Doesn't work for me but I don't mind because I don't want to use extra
truncate_month = connection.ops.date_trunc_sql('month','day')
invoices = Invoice.objects.filter(is_deleted = False,company = company).extra({'month': truncate_month}).values('month').annotate(Sum('total'))
----
#It works but I think that it's too slow if I query a big set of data
for current_month in range(1,13):
Invoice.objects.filter(date__month = current__month).annotate(total = Sum("total"))
Run Code Online (Sandbox Code Playgroud)
而这一个,答案似乎很好,但我无法导入TruncMonth模块.
PS我知道这个问题已被多次询问,但我没有看到任何答案.
谢谢!
解决方案:
感谢@ Vin-G的回答.
我有一个带created时间戳的Django模型,我想获得每天创建的对象计数.我希望在Django中使用聚合功能,但我无法弄清楚如何用它来解决我的问题.假设这不起作用我总是可以回到刚刚使用values_list获取所有日期,但我更愿意将工作交给Django或DB.你会怎么做?
使用Django DateQuerySet我会item从Group查询中提取相关年份.
>>> Group.objects.all().dates('item__date', 'year')
[datetime.date(1990, 1, 1), datetime.date(1991, 1, 1), ...(remaining elements truncated)...']
Run Code Online (Sandbox Code Playgroud)
现在我想在这些日期按不同的年份进行计数.我认为这会奏效:
>>> Group.objects.all().dates('item__date', 'year').annotate(Count('year'))
FieldError: Cannot resolve keyword 'year' into field.
Run Code Online (Sandbox Code Playgroud)
但看起来我错过了一些东西.我该如何修复此查询?
我也试过这个查询:
>>> (Group
.objects
.all()
.extra(select=
{'year':
connections[Group.objects.db].ops.date_trunc_sql('year', 'app_item.date')}))
ProgrammingError: missing FROM-clause entry for table "app_item" LINE 1: SELECT (DATE_TRUNC('year', app_item.date)) AS...
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.
假设我有这样的模型:
class Entity(models.Model):
start_time = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
我想将它们重新组合为列表列表,每个列表列表包含来自同一日期的实体(同一天,时间应该被忽略).
如何以pythonic方式实现这一目标?
谢谢
我试图按日期过滤用户,但直到我可以找到数据库中用户的第一个和最后一个日期.虽然我可以让我的脚本稍后过滤掉重复,但我想从一开始就使用Django来做,distinct因为它显着减少了.我试过了
User.objects.values('install_time').distinct().order_by()
Run Code Online (Sandbox Code Playgroud)
但既然install_time是a timestamp,它包括日期和时间(我并不在乎).因此,它过滤掉的唯一日期是我们可以检索多个用户的安装日期而不是时间的日期.
知道怎么做吗?我使用Django 1.3.1,Postgres 9.0.5和最新版本的psycopg2来运行它.
编辑:我忘了添加以下数据类型install_time:
install_time = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
编辑2:这是Postgres shell的一些示例输出,以及我想要的快速解释:
2011-09-19 00:00:00
2011-09-11 00:00:00
2011-09-11 00:00:00 <--filtered out by distinct() (same date and time)
2011-10-13 06:38:37.576
2011-10-13 00:00:00 <--NOT filtered out by distinct() (same date but different time)
Run Code Online (Sandbox Code Playgroud)
我知道Manager.raw,但宁愿用户django.db.connection.cursor直接编写查询,因为Manager.raw返回一个RawQuerySet,IMO,比手动编写SQL查询和迭代更糟糕.
是否可以在不使用select方法的情况下在Django中重现以下mysql查询?
MariaDB [db1]> SELECT datetime, SUM(datas) FROM table AND datetime BETWEEN '2013-07-26 13:00:00' AND '2013-07-26 23:00:00' GROUP BY datetime;
Run Code Online (Sandbox Code Playgroud)
为了得到这样的结果:
+---------------------+-----------+
| datetime | SUM(data) |
+---------------------+-----------+
| 2013-07-26 13:00:00 | 489 |
| 2013-07-26 14:00:00 | 2923 |
| 2013-07-26 15:00:00 | 984 |
| 2013-07-26 16:00:00 | 2795 |
| 2013-07-26 17:00:00 | 1308 |
| 2013-07-26 18:00:00 | 1365 |
| 2013-07-26 19:00:00 | 1331 |
| 2013-07-26 20:00:00 | 914 |
| 2013-07-26 21:00:00 | 919 …Run Code Online (Sandbox Code Playgroud) 我想在使用DRF发送回JSON响应之前执行一些数据操作。
我的模型是:
class ThirdParty(models.Model):
label = models.CharField(verbose_name=_("Third party label"), null=False, blank=False, default=DEFAUT_LABEL, max_length=255)
class CashFlow(TimeStampedModel):
date = models.DateField(verbose_name=_("Due date"), null=True, blank=True)
forecasted_value = models.DecimalField(verbose_name=_("Forecasted value"), null=True, blank=True, max_digits=11, decimal_places=2)
third_party = models.ForeignKey(ThirdParty, null=False, blank=False, related_name='cashflows')
Run Code Online (Sandbox Code Playgroud)
目前,我有两个序列化器:
class CashFlowSerializer(serializers.ModelSerializer):
third_party = serializers.PrimaryKeyRelatedField(many=False, read_only=True, allow_null=True)
class Meta:
model = CashFlow
fields = ('id', 'date', 'forecasted_value', 'edited_value', 'third_party')
class ThirdPartyReadSerializer(serializers.ModelSerializer):
cashflows = CashFlowSerializer(many=True, read_only=True)
class Meta:
model = ThirdParty
fields = ('id', 'label', 'category', 'cashflows',)
Run Code Online (Sandbox Code Playgroud)
而且我的ThirdParty视图正确地返回了一个不错的JSON作为:
{
"id": 15,
"label": "Adeo",
"category": …Run Code Online (Sandbox Code Playgroud) 我已经通过谷歌搜索“django group by Month”阅读了这篇Django: Group by date (day,month,year)以及所有相关内容
如果我尝试“最干净”的解决方案 - 使用 Django 1.11,我最终会得到以下结果:
class Request(BaseModel):
date_creation = models.DateTimeField(default=None,
blank=True, null=True)
print([v for v in
Request.objects.annotate(month=ExtractMonth('date_creation'),
year=ExtractYear('date_creation'),)
.values('month', 'year')
.annotate(total=Count('month'))
.values('month', 'year', 'total')
])
Run Code Online (Sandbox Code Playgroud)
结果不进行分组!我明白了:
[{'month': 6, 'year': 2017, 'total': 1},
{'month': 7, 'year': 2017, 'total': 1},
{'month': 7, 'year': 2017, 'total': 1}]
Run Code Online (Sandbox Code Playgroud)
我需要得到:
[{'month': 6, 'year': 2017, 'total': 1},
{'month': 7, 'year': 2017, 'total': 2}]
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
print([v for v in
Request.objects.extra({'month': 'strftime("%m", date_creation)',
'year': 'strftime("%Y", date_creation)'})
.values('month', 'year') …Run Code Online (Sandbox Code Playgroud) 我正在四处寻找如何按月分组django查询集.我终于找到了这段非常有用的代码:
truncate_date = connection.ops.date_trunc_sql('day','timestamp')
qs = qs.extra({'date':truncate_date})
return qs.values('date').annotate(Sum('amount')).order_by('date')
Run Code Online (Sandbox Code Playgroud)
它工作正常,但date返回的是一个字符串,而不是一个正确的datetime.date,我不能{{date|date:format}}在模板中使用.似乎原始发件人(Oli)有同样的问题.虽然正在回答的人说它适用于postgres但我没有在SQLite上取得任何成功.
是否可以在查询或模板中将字符串转换为日期时间.或者我是否必须遍历所有条目?
很抱歉在一个单独的趋势中发布,但我没有足够的特权来评论原始的趋势.
django ×11
python ×7
datetime ×1
django-1.1 ×1
django-forms ×1
django-orm ×1
group-by ×1
mysql ×1
postgresql ×1