Как заставить Django увеличивать поле по значению db?
Например, у меня есть модель:
class CacheMetaData(models.Model):
count = models.IntegerField(default=0)
def inc(self):
self.count += 1
self.save()
Если я определяю метод inc()
, как описано выше, то Django выполнит SQL-запрос следующего вида:
UPDATE the_table set count = 1 where id = 1
Это приведет к состоянию гонки, так что count
может быть некорректно увеличен. Я хочу, чтобы Django выполнил:
update the_table set count = count + 1
Так что счет всегда будет правильно увеличен.
Может ли Django сделать это? Если да, то как определить поле count
?
Согласно документации django вы можете использовать выражение F, как показано ниже:
from django.db.models import F
class CacheMetaData(models.Model):
count = models.IntegerField(default=0)
def inc(self):
self.count = F("count") + 1
self.save()
в вашей версии django увеличивает значение памяти count
на 1 и устанавливает его в базу данных, что может привести к состоянию гонки, но в этой версии увеличивающийся процесс выполняется базой данных и значение базы данных count
увеличивается на 1.
примечание: если вы хотите использовать значение count
в вашем коде, вам нужно выполнить self.refresh_from_db()
для обновления памяти из db.
Часто вам не нужно сначала получить элемент в памяти, вы можете использовать:
from django.db.models import F
CacheMetaData.objects.filter(pk=my_pk).update(count=F('count') + 1)
Таким образом, запрос будет сохранен.