Reputation: 212
I have two different models
class Part(models.Model):
partno = models.CharField(max_length=50)
price = models.PositiveIntegerField(default= 0)
tax = models.PositiveIntegerField(default= 0)
created_date = models.DateField(auto_now_add=True)
class PurchaseOrder(models.Model):
part = models.ForeignKey(Part, on_delete=models.CASCADE)
po_quantity = models.PositiveIntegerField(default= 0)
amount = models.PositiveIntegerField(default= 0)
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
created_date = models.DateField(auto_now_add=True)
I'd like to multiply price
from Part with po_quantity
and result show in the amount
. e.g
amount = price * po_quantity
Can someone assist me to solve this?
Upvotes: 1
Views: 352
Reputation: 476554
Since amount
fully depends on the price
and the po_quantity
, you better use a property for this. Otherwise you introduce data duplication. You thus can implement this as:
class PurchaseOrder(models.Model):
part = models.ForeignKey(Part, on_delete=models.CASCADE)
po_quantity = models.PositiveIntegerField(default= 0)
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
created_date = models.DateField(auto_now_add=True)
@property
def amount(self):
return self.po_quantity * self.part.price
If you need to use the amount
when filtering, you can use .annotate(…)
[Django-doc] instead, and define this for example in a Manager
:
from django.db.models import F
class PurchaseOrderManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).annotate(
amount=F('po_quantity') * F('part__price')
)
class PurchaseOrder(models.Model):
part = models.ForeignKey(Part, on_delete=models.CASCADE)
po_quantity = models.PositiveIntegerField(default= 0)
supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
created_date = models.DateField(auto_now_add=True)
objects = PurchaseOrderManager()
Upvotes: 1