Usando señales en Django para controlar el stock
Ahora mismo estoy de lleno con la gestión del stock. El escenario es el siguiente:
# models.py
class Article(models.Model):
...
class Order(models.Model):
...
class OrderDetail(models.Model):
order = models.ForeignKey('Order', ...)
article = models.ForeignKey('Article', ...)
amount = models.PositiveSmallIntegerField(...)
...
Tras analizarlo todo, lo más adecuado y sensato me parece utilizar el mecanismo de señales que ofrece Django para el control del stock.
from django.db.models import signals
# Almacenamiento temporal
temp_pre_save = {}
def watch_stock_handler(sender, instance, *args, **kwargs):
# Cada vez que se inicie save, almacenamos la cantidad
temp_pre_save[instance.id] = instance.amount
def update_stock_handler(sender, instance, created, *args, **kwargs):
if created:
# Directamente descontamos artículos
else:
if temp_pre_save[instance.id] > instance.amount:
# Se añaden artículos al detalle
elif temp_pre_save[instance.id] < instance.amount:
# Se quitan artículos del detalle
# Limpiamos el almacenamiento temporal
temp_pre_save.pop(instance.id)
def delete_stock_handler(sender, instance, *args, **kwargs):
# Restauramos la cantidad
...
# Añadimos los callbacks
signals.post_init.connect(watch_stock_handler, sender=OrderDetail)
signals.post_save.connect(update_stock_handler, sender=OrderDetail)
signals.pre_delete.connect(delete_stock_handler, sender=OrderDetail)
:)
Tags
La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.
