То, что вы пытаетесь сделать, называется «денормализация» - если значение remain
зависит от quantity
и sold
, вам теоретически не следует хранить его в базе данных (иначе вы можете иметь противоречивые данные),
Если вы все еще действительно хотите это сделать, вы должны убедиться, что это значение обновляется каждым фрагментом кода, который касается либо quantity
, либо sold
.
Самым безопасным способом был бы триггер уровня базы данных (который зависит от вашего поставщика БД, и на самом деле это не вопрос Django или Python xD).
Другое, менее безопасное, решение заключается впересчитайте значение в методе save()
модели:
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
self.remain = self.countremain()
if update_fields:
# could be either a tuple or list so we make sure
# it's a list
update_fields = list(update_fields) + ["remain"]
super(Item, self).save(force_insert, force_update, using, update_fields)
Обратите внимание, что это не совсем безопасно, так как оно не будет вызвано Queryset.update(...)
- и, конечно, не будет запущено любымдругой клиент БД.