Форматирование даты для подсчета комментариев в Django + Python 3 - PullRequest
0 голосов
/ 07 октября 2018

В настоящее время я пытаюсь аннотировать и подсчитывать некоторые даты в зависимости от того, сколько раз они появляются.

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 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. 2.

Кто-нибудь может привести меня в правильном направлении?

Кроме того, каков самый «django» способ преобразования дат во что-то более json?/ api friendly?

Мой идеальный возврат json будет примерно таким:

{'timestamp': 2018-10-5, 'count': 2}

Спасибо!

1 Ответ

0 голосов
/ 07 октября 2018

Для этого вы можете использовать аннотацию 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)
...