Генерация статистики доступа за периоды времени в Джанго - PullRequest
0 голосов
/ 14 июля 2011

Я пытаюсь реализовать статистику для существующего сайта, но я полностью потерян, не знаю, какую структуру модели выбрать.Теперь то, что у меня есть (соответствующие части модели):

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)

1 Ответ

0 голосов
/ 14 июля 2011

Когда мне нужна такая статистика, я создаю менеджер классов и комментирую, используя raw sql:

class nFileManager(models.Manager):
    def with_stats(self):
        return self.extra(
            'downloads_07n_day': """
                 SELECT COUNT(distinct d.id) FROM myapp_downloads d
                 WHERE d.nfile_id == myapp_nfile.id
                 AND d.date > now() - interval 7 days
             """,
            'downloads_30_day': """
                 SELECT COUNT(distinct d.id) FROM myapp_downloads d
                 WHERE d.nfile_id == myapp_nfile.id
                 AND d.date > now() - interval 30 days
             """
        )

Затем вы добавляете этого менеджера в свой объект:

def nFile(...):
    ...
    objects = nFileManager()

Теперь выможно применить with_stats к объектам, чтобы получить эти значения:

nFile.objects.with_stats().filter(...)

Он также работает с некоторыми агрегатами (для получения ваших категорий).

Обратите внимание, что это усложняет сквозные таблицы, вы 'Вам также понадобится явная таблица с датой и идентификатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...