Я пытаюсь реализовать статистику для существующего сайта, но я полностью потерян, не знаю, какую структуру модели выбрать.Теперь то, что у меня есть (соответствующие части модели):
class nFile(models.Model):
title = models.CharField(max_length=40)
upfile = models.FileField()
downloaded = models.IntegerField() # here I count the downloads
viewed = models.IntegerField() # here I count the quickviews
comment = models.CharField(max_length=400)
tags = TagField()
category = models.ForeignKey(FileCategory)
, что я хочу, - это производить статистику с такими столбцами:
file name | downloads for the last 30 days | downloads for the last 7 days | downloads to date | category
с возможностью упорядочения потри средних значения столбца.
пример:
sunshine.bmp | 12 | 7 | 20 | pics
cake.txt | 13 | 5 | 15 | receipes
...
Я также хочу подсчитать количество уникальных посетителей.Таким образом, мое первое впечатление было реализовать новую модель, подобную этой:
class Visitor(models.Model):
session_key = models.CharField( max_length = 40 )
enter_date = models.DateTimeField( auto_now_add = True, editable = False )
leave_date = models.DateTimeField( auto_now_add = True, editable = False )
и добавить к модели nFile два поля:
downloaders = models.ManyToManyField( Visitor )
viewers = models.ManyToManyField( Visitor )
Я могу управлять каждым полем этого нового класса,и я думаю, что каждая информация находится в базе данных (сейчас это SqLite3, на производстве Postgre), но какие запросы я должен использовать.Возможно, мне следует использовать другую модель или добавить новое поле в класс nField, я не знаю.
Я также хочу иметь статистику, аналогичную выше, для категорий и тегов, таких как:
category | downloads for the last 30 days | downloads for the last 7 days | downloads to date
и
tag | downloads for the last 30 days | downloads for the last 7 days | downloads to date
Я думаю, что должен использовать агрегацию и фильтрацию, но не могу найти волшебную комбинацию.
Редактировать 1:
Нет реакции, поэтому я пытаюсь уточнить, что я хочу.
такой запрос даст мне
q = nFile.objects.annotate(dcount=Count('downloaders'))
список nfiles с общим количествомзагрузчики, что-то вроде этого:
q[0].title = sunshine.bmp
q[0].dcount = 20
q[1].title = cake.txt
q[1].dcount = 15
верно?но я не хочу просто комментировать все загрузчики, я хочу аннотировать количество посетителей, чья enter_date находится между текущей и текущей датой (days = 7)