Modelli di grasso di Django: dove devo inserire la logica di creazione del modello?

0

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 :

  1. 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.
  2. Dopodiché, receipt.update_total (amount) correlato dovrebbe essere chiamato con product.price * quantity come amount per sincronizzare l'importo della ricevuta.
  3. Il campo Prodotto sold_quantity dovrebbe essere aumentato del valore ReceiptItem istanza quantità .
  4. 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!

    
posta Miles Davis 07.06.2018 - 14:40
fonte

0 risposte

Leggi altre domande sui tag