在 Django 中格式化日期以注释计数 + Python 3
Formatting dates for annotating count in Django + Python 3
我目前正在尝试根据日期出现的次数来注释和计算一些日期。
visits = Subs.objects.filter(camp=campdata, timestamp__lte=datetime.datetime.today(), timestamp__gt=datetime.datetime.today()-datetime.timedelta(days=30)).\
values('timestamp').annotate(count=Count('timestamp'))
如果我在 for 循环中打印它,例如
for a in visits:
print(a)
我会在 Json 中取回以下内容。
{'timestamp': datetime.datetime(2018, 10, 5, 15, 16, 25, 130966, tzinfo=<UTC>), 'count': 1}
{'timestamp': datetime.datetime(2018, 10, 5, 15, 16, 45, 639464, tzinfo=<UTC>), 'count': 1}
{'timestamp': datetime.datetime(2018, 10, 6, 8, 43, 24, 721050, tzinfo=<UTC>), 'count': 1}
{'timestamp': datetime.datetime(2018, 10, 7, 4, 54, 59, tzinfo=<UTC>), 'count': 1}
这是一个正确的方向,但是,它是从秒数开始的。我只需要几天,这样发生在 2018 年 10 月 5 日的事件将计数:例如 2。
谁能引导我走向正确的方向?
此外,什么是最 "django" 将日期转换成更 json / api 友好的方式?
我的理想json return会是
{'timestamp': 2018-10-5, 'count': 2}
谢谢!
您可以使用 TruncDate
注释来实现:
visits = Subs.objects.annotate(date=TruncDate('timestamp')).filter(
camp=campdata,
date__lte=datetime.datetime.today(),
date__gt=datetime.datetime.today() - datetime.timedelta(days=30)
).values('date').annotate(count=Count('date'))
关于 JSON 序列化日期的问题,Django 提供了 DjangoJSONEncoder
来帮助解决这个问题:
import json
from django.core.serializers.json import DjangoJSONEncoder
json.dumps(list(visits), cls=DjangoJSONEncoder)
我目前正在尝试根据日期出现的次数来注释和计算一些日期。
visits = Subs.objects.filter(camp=campdata, timestamp__lte=datetime.datetime.today(), timestamp__gt=datetime.datetime.today()-datetime.timedelta(days=30)).\
values('timestamp').annotate(count=Count('timestamp'))
如果我在 for 循环中打印它,例如
for a in visits:
print(a)
我会在 Json 中取回以下内容。
{'timestamp': datetime.datetime(2018, 10, 5, 15, 16, 25, 130966, tzinfo=<UTC>), 'count': 1}
{'timestamp': datetime.datetime(2018, 10, 5, 15, 16, 45, 639464, tzinfo=<UTC>), 'count': 1}
{'timestamp': datetime.datetime(2018, 10, 6, 8, 43, 24, 721050, tzinfo=<UTC>), 'count': 1}
{'timestamp': datetime.datetime(2018, 10, 7, 4, 54, 59, tzinfo=<UTC>), 'count': 1}
这是一个正确的方向,但是,它是从秒数开始的。我只需要几天,这样发生在 2018 年 10 月 5 日的事件将计数:例如 2。
谁能引导我走向正确的方向?
此外,什么是最 "django" 将日期转换成更 json / api 友好的方式?
我的理想json return会是
{'timestamp': 2018-10-5, 'count': 2}
谢谢!
您可以使用 TruncDate
注释来实现:
visits = Subs.objects.annotate(date=TruncDate('timestamp')).filter(
camp=campdata,
date__lte=datetime.datetime.today(),
date__gt=datetime.datetime.today() - datetime.timedelta(days=30)
).values('date').annotate(count=Count('date'))
关于 JSON 序列化日期的问题,Django 提供了 DjangoJSONEncoder
来帮助解决这个问题:
import json
from django.core.serializers.json import DjangoJSONEncoder
json.dumps(list(visits), cls=DjangoJSONEncoder)