Sto leggendo Two Scoops of Django 1.11. Al capitolo 7 introduce "modelli grassi". Dice che la pratica migliore è quella di inserire una grande parte della logica nel modello e mantenere le visualizzazioni il più sottili possibile, ma in tal caso non approfondisce l'argomento. Supponendo che questo modo di pensare sia la migliore pratica del django e supponiamo modelli come questi:
class Product(models.Model):
name = models.CharField(max_length=50)
price = models.DecimalField(decimal_places=2, max_digits=4)
categories = models.ForeignKey(Category, on_delete=models.CASCADE)
sold_quantity = models.PositiveIntegerField(default=0)
stock_quantity = models.PositiveIntegerField(default=0)
class Receipt(models.Model):
is_paid = models.BooleanField(default=False)
total = models.DecimalField(decimal_places=2, max_digits=4, default=0)
def update_total(self, amount):
self.total += amount
class ReceiptItem(models.Model):
product = models.ForeignKey(Product, null=True, on_delete=models.SET_NULL)
receipt = models.ForeignKey(Receipt, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
Quando viene creato un ReceiptItem :
- Il campo ReceiptItem scontrino dovrebbe puntare all'ultimo Ricevimento il cui valore is_paid è False. Se questo Ricevimento non esiste, quindi crealo e puntalo ad esso.
- Dopodiché, receipt.update_total (amount) correlato dovrebbe essere chiamato con product.price * quantity come amount per sincronizzare l'importo della ricevuta.
- Il campo Prodotto sold_quantity dovrebbe essere aumentato del valore ReceiptItem istanza quantità .
- Il prodotto quantità_chiesta dovrebbe essere diminuito del valore ReceiptItem istanza quantità .
Dove dovrei inserire questa logica? Penso che dovrebbe andare nel modello ReceiptItem , ma in questo caso, come posso ottenere in "modi non complicati" punto 1 ?
Un'estensione ipotetica di ReceiptItem potrebbe, forse, avere questi metodi?
def create(self):
(self.receipt, _) = Receipt.objects.get_or_create(is_paid=False)
self.receipt.update_total(self.quantitiy * self.price)
self.product.sold_quantity += self.quantity
self.product.stock_quantity -= self.quantity
def save(self, *args, **kwargs):
self.receipt.save()
self.product.save()
super(ReceiptItem, self).save(*args, **kwargs)
È una cattiva idea salvare gli oggetti correlati che sostituiscono il metodo di salvataggio? È corretta la pratica per definire un metodo "crea" (o forse classmethod) per operare su modelli correlati? O dovrei provare a suddividere questa logica nei rispettivi modelli in qualche modo?
Grazie!