2011-07-14 39 views
0

我試圖爲現有的網站實施統計,但我完全失去了,不知道選擇哪種模型結構。現在,我有什麼(模型的相關部分):在Django的時間段生成訪問統計

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) 

,並加入到n文件模型中的兩個領域:

downloaders = models.ManyToManyField(Visitor) 
    viewers = models.ManyToManyField(Visitor) 

我可以管理這個新類的每一個領域,我認爲每一個info在數據庫中(現在是SqLite3,在生產Postgre上),但是我應該使用哪些查詢。也許我應該使用不同的模型,或者把一個新的Field放到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現在和now-timedelta(天= 7)

+0

目前還不清楚你實際要問什麼。你似乎有一些體面的想法去哪裏。你從這裏前進的問題是什麼? – Marcin

+0

@Marcin我不知道如何構建一個能產生理想結果的查詢集。我也不確定我是否在正確的方式解決這個任務(我的意思是訪問者模型本身或/和nFile模型的連接可能不好)。 – balazs

+0

我建議在你的問題中提出任何澄清。廣泛編輯您的問題以使其更加清晰沒有任何問題。 – Marcin

回答

0

之間的訪問者當我需要這樣的統計我創建一個使用原始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(...) 

它也適用於一些聚合(以獲得您的類別)。

請注意,這會讓您的表格變得更加複雜,您還需要一個帶有日期和ID的明確表格。

+0

謝謝,我會試試看。我只是想知道有沒有這樣做的「Django方式」?在這種情況下,性能並不重要,只要管理員可以查看統計信息。 – balazs

+0

不是沒有很多查詢。基本上你需要查詢每個註釋(30天,7天,...),然後合併結果。按類別收集需要爲每個類別查詢每個查詢。快速生長失控。 Django聚合中也會遇到一些缺陷,您將遇到。 –