1

この質問から抜粋したスニペット

from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F(hit_count)+1)

ミドルウェアを入れることが提案され、ミドルウェアについて少し読みましたが、誰かがこの状況で何をするかを指摘していただければ幸いです。私のBugモデルを例として使用すると、固有のスラッグフィールドとpkがあります。

これが私のモデルです:

class Bug( models.Model ):
    name = models.CharField( max_length=100 )
    slug = models.SlugField(unique=True)
    excerpt = models.TextField()
    excerpt_markdown = models.TextField( editable=False, blank=True )
    summary = models.TextField()
    summary_markdown = models.TextField(editable=False, blank=True)
    #workaround = models.TextField()
    #workaround_markdown = models.TextField(editable=False, blank=True)
    date_added = models.DateTimeField()
    poster = models.ForeignKey(User)
    tags_string = TagField()

    class Meta:
    ordering = ['name']

    def __unicode__(self):
    return self.name

    def get_absolute_url(self):
    return '/bugs/%s/' % self.slug

    def save( self, force_insert=False, force_update=False ):
    self.summary_markdown = markdown(  self.summary  )
    self.excerpt_markdown = markdown ( self.excerpt )
    #self.workaround_markdown = markdown(  self.workaround )
    super( Bug, self ).save( force_insert, force_update )

リンクはを介して表示され/bugs/(slug)ます。新しい列をまだ追加していませんが、それはただのことだと思いますhit_counter = models.IntegerField()

4

3 に答える 3

3

次の 3 つのオプションがあります。

  1. コードをミドルウェアに配置して、RequestContext を介してテンプレートで広く使用できるようにします。

  2. この「ヒット カウント」コードを適用する場所を決定できるように、コードをデコレータ (基本的には、別の関数をラップしていくつかの機能を追加する単なる Python 関数) に配置します。

  3. タグを含むテンプレートがレンダリングされるたびにカウンターをインクリメントするカスタム テンプレート タグにコードを配置します。

オプション 3 (テンプレート タグ) は最も複雑ですが、単一のコードでカウンターをレンダリングしてインクリメントできるため、実際の目的に最も適しています。オプション 1 (ミドルウェア) は最も簡単ですが、柔軟性/再利用性が最も低くなります。

ミドルウェアとテンプレートのタグは、どちらも Django のドキュメントで詳しく説明されています。SO でコード スニペットを渡されるよりも、それらを処理することで多くのことを得ることができます。

デコレーターは v2.4 以降の Python の基本的な部分であり、学ぶ価値はありますが、ここで選択するソリューションではありません。それらは強力なツールであり、Google 検索 (または SO での検索) で大量の情報が得られます。

于 2010-06-21T07:49:18.407 に答える
1

ユーザーがモデルを表示するたびにモデルを保存すると、ほとんどのキャッシュが無意味になることに注意してください。これは、モデルがどのキャッシュよりも新しいためです。

それが重要な場合は、キャッシュを保持するアプローチを検討することをお勧めします。たとえば、代わりにすべてのビューで個別のヒット モデルを更新し、キャッシュに適した間隔でそれらのヒット カウントをメイン モデルに戻します。

于 2010-06-21T14:11:11.910 に答える
0

私はそれをデコレータ内に置き、このモデルにアクセスするすべてのビューを装飾することを好みます

于 2010-06-21T06:56:53.877 に答える