Автоматическое обновление значения модели на основе другого значения в этой модели django
У меня есть модель под названием Products. Эта модель имеет такие значения
class Product(models.Model):
title = models.CharField(max_length=70, null=True, blank=True)
producent = models.CharField(max_length=40, null=True, blank=True)
stock = models.PositiveIntegerField(default=0, null=True, blank=True)
display = models.BooleanField(null=True, blank=True, default=True)
Как я могу изменить display на False если запас автоматически равен 0, так что когда клиент покупает последний товар в магазине, значение дисплея изменится с True на False и
Product.objects.filter(display=True)
в результате будут показаны товары, которые я хочу показать или которые есть на складе.
Я знаю, что могу просто выстроить цепочку .filter(), но мне интересно, могу ли я сделать это элегантным способом
За то, что вы сказали, я думаю, что у вас есть намерение снизить стоимость акций
Добавьте эту логику в ваше представление, после обновления стоимости акций:
if product.stock==0:
product.display = False
product.save()
Учитывая, что ваше представление (используемое для уменьшения стоимости запасов) уже инстанцировало цель "product". Если это вам не помогло, пожалуйста, опубликуйте ваш view.py, чтобы дать нам больше информации.
Я бы оставил поле display: добавление логики для установки этого поля сделает сервер более сложным, и это также означает, что если позже запасы снова будут доступны, кто-то должен вручную установить display обратно в True, поскольку вы не можете знать, было ли display установлено в False потому что вы не хотите отображать товар, или потому что не было запасов.
Вы можете фильтровать с помощью:
Product.objects.filter(display=True, stock__gt=0)
Поскольку вы, вероятно, хотите делать это почти каждый раз, когда обращаетесь к объектам, вы можете переопределить objects mananger с помощью custom manager [Django-doc]:
class ProductManager(models.Manager):
def get_querset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
display=True, stock__gt=0
)
class Product(models.Model):
# …
objects = ProductManager()
Если вы сейчас используете, например, Product.objects.all(), он автоматически отфильтрует элементы Product. Если вам нужны все Product, вы можете работать с Product._base_manager.all().