Где разместить этот код инкремента счетчика посещений? - PullRequest
1 голос
/ 21 июня 2010

Фрагмент, взятый из этого вопроса

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()

Ответы [ 3 ]

3 голосов
/ 21 июня 2010

У вас есть три варианта:

  1. Поместите код в промежуточное ПО, чтобы он был универсально доступен в вашем шаблоне через RequestContext.

  2. Поместите код в декоратор (по сути, просто функцию Python, которая оборачивает другую функцию и добавляет некоторые функции), чтобы вы могли решить, где вы хотите применить этот код "подсчета совпадений".

  3. Поместите код в пользовательский тег шаблона, который будет увеличивать счетчик каждый раз при визуализации шаблона с тегом.

Вариант три (тег шаблона) является наиболее сложным, но наиболее подходящим для фактической цели, поскольку он может визуализировать счетчик и увеличивать его в одном куске кода. Вариант 1 (промежуточное программное обеспечение) является самым простым, но также наименее гибким / многократно используемым и т. Д.

Промежуточное ПО и теги шаблонов хорошо документированы в документации Django. Вы получите намного больше от их работы, чем от передачи фрагмента кода в SO.

Декораторы являются основной частью Python начиная с версии 2.4, и их стоит изучить, но не решение, которое я выбрал бы здесь. Это мощный инструмент, и поиск в Google (или даже поиск по SO) даст вам тонны информации.

1 голос
/ 21 июня 2010

Вероятно, стоит указать, что если вы сохраняете модель каждый раз, когда пользователь просматривает ее, большинство кешей будет лишено смысла, поскольку модель будет свежее любого кеша.

Если это важно дляВы, возможно, захотите рассмотреть подход, который сохранит кэширование - например, вместо этого обновляйте отдельную модель Hits для каждого представления, а затем сворачивайте эти счетчики обращений обратно в основную модель с интервалами, подходящими для кэша.

0 голосов
/ 21 июня 2010

Я предпочитаю поместить его в декоратор и украсить все виды, которые имеют доступ к этой модели

...