в django models.py, как сделать так, чтобы оставшийся столбец количества таблицы элементов изменялся автоматически? - PullRequest
1 голос
/ 07 ноября 2019
class Item(models.Model):
    name=models.CharField(max_length=100)
    price=models.DecimalField(max_digits=6, decimal_places=2)
    quantity=models.IntegerField(default=0)
    sold=models.IntegerField(default=0)
    qtt=0
    def countremain(self):
        qtt=self.quantity-self.sold
        return qqt
    remain=models.IntegerField(qqt)

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

1 Ответ

1 голос
/ 07 ноября 2019

То, что вы пытаетесь сделать, называется «денормализация» - если значение 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(...) - и, конечно, не будет запущено любымдругой клиент БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...