Как заставить 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)

Таким образом, запрос будет сохранен.

Вернуться на верх