2011-07-14 6 views
0

私は既存のサイトの統計を実装しようとしていますが、完全に失われています。どのモデル構造を選択するのか分かりません。今、私が(モデルの関連部分)を持つ:3つの中央の列によって発注の可能性djangoの期間にわたるアクセス統計の生成

file name | downloads for the last 30 days | downloads for the last 7 days | downloads to date | category 

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) 

私が欲しいものは、このような列の統計値を生成することです値。

ので、例:

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) 

、と私はすべてを考えますinfoはデータベースにあります(現在はPostgreSQLのSqLite3ですが、どのようなクエリを使うべきですか)。おそらく、別のモデルを使用するか、nFieldクラスに新しいFieldを配置する必要があります。わかりません。

私もカテゴリの、上記と同様の統計を持つようにしたい、などのタグ:

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[0].title = sunshine.bmp 
q[0].dcount = 20 
q[1].title = cake.txt 
q[1].dcount = 15 

右:

このようなクエリは、ダウンローダの総数は、このようなもので、

q = nFile.objects.annotate(dcount=Count('downloaders')) 

に私にNFILESのリストを与えるでしょうか?しかし、私はすべてのダウンローダに注釈を付けるだけで、私は注釈を付けたいと思います。現在と今の間のenter_dateの人数をカウントしてください(日= 7)

+0

実際に何を求めているのかはっきりしません。あなたはどこに行くべきかについてまともなアイデアを持っているようです。あなたがここから先に進んでいる問題は何ですか? – Marcin

+0

@Marcin私は望みの結果を生み出すクエリーセットを作る方法を知らない。また、私はこのタスクを解決する正しい方法を確信していません(Visitorモデルそのもの、または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

ありがとう、私はそれを試してみます。私はちょうどこれを行うの "ジャンゴの方法"があるのだろうか?この場合、パフォーマンスは重要ではなく、管理者だけが統計情報を見ることができます。 – balazs

+0

たくさんの質問がないわけではありません。基本的には、各注釈(30日、7日、...)を照会してから結果をマージする必要があります。カテゴリ別に収集するには、各カテゴリのクエリごとにクエリが必要です。素早く手を伸ばします。また、Djangoの集約にはいくつかの欠点があります。 –

関連する問題