Инкрементный хит страницы рассчитывает в Django

Эта функция будет сравнивать все свойства этих двух объектов одного типа. В функции takeAction он предпримет правильное действие. Вероятно, можно было бы сделать лучше, но я нахожу это более читабельным.

let a = { name : 'same', uri: 'samee', info: 'not same'};
const b = { name : 'same', uri: 'samee', info: 'same'};
areSame(a,b);
console.log(a, b);

function areSame(a,b){
  const aKeys = Object.keys(a);
  for(let key of aKeys){
    if(a[key] !== b[key]){
      // shouldUpdate = true;
      takeAction(a,b, key)
    } 
  }
}

function takeAction(a,b, key){
  switch(key){
    case "name": {
      a.name = b.name;
      document.write('name action taken');
      break;
    }
    case "uri": {
      // parse uri
      a.uri = b.uri;
      document.write('uri action taken');
      break;
    }
      
    case "info": {
        // activation: offer.activation,
        // image: offer.image
      document.write('info action taken');
      break;
    }
  }
}

16
задан Cairnarvon 6 June 2013 в 05:11
поделиться

4 ответа

При использовании Django 1.1 + просто используйте выражения F :

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

Это выполнит единственный атомарный запрос базы данных.

, Поскольку gerdemb говорит, необходимо полагать, что помещение этого в промежуточном программном обеспечении делает его легко допускающим повторное использование, таким образом, он не загромождает все представления.

<час>
31
ответ дан 30 November 2019 в 16:58
поделиться

Как gerdemb говорит, необходимо записать это в промежуточное программное обеспечение для создания его действительно допускающим повторное использование. Или (более простая) запись функциональный декоратор. На самом деле существуют адаптеры для использования промежуточного программного обеспечения в качестве декоратора и наоборот.

, Но если Вы волнуетесь по поводу производительности и хотите сохранить запросы DB на страницу, обновляет минимум, можно использовать атомарную инкрементную операцию memcached. конечно, в этом случае, необходимо заботиться о персистентности сами.

4
ответ дан 30 November 2019 в 16:58
поделиться

Образцовые конвенции не будут атомарными; запишите это вручную:

BEGIN
SELECT * FROM table WHERE id=3 FOR UPDATE
UPDATE table SET hit_count=hit_count+1 WHERE id=3
COMMIT
0
ответ дан 30 November 2019 в 16:58
поделиться

Я запустил бы путем рассмотрения документации для промежуточное программное обеспечение . Комментарий Ignacio об отсутствии атомарных транзакций верен, но это - проблема со всей платформой Django. Если Вы не обеспокоены наличием 100%-го точного счетчика, я не волновался бы об этом.

0
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: