两个外键模型字段之间的差异

时间:2019-08-29 05:48:43

标签: django django-models

我有一个名为“ CarAdd”的模型,另外两个模型通过外键连接到该CarAdd模型,分别是ShippingDetails,MaintenanceDetails。并且每个外键模型都有一个项目和价格字段。“外键在一个id下有两个以上的项目”

我需要找到每辆车的利润额

profit = sold_amount - (purchased amount + total shipping cost + total maintenance cost)

class CarAdd(models.Model):

    # Car Details
    name = models.CharField(max_length=60)
    purchased_amount = models.DecimalField()
     # there 3 choices in STATUS shipped, maintenance, sold
    status = models.CharField(max_length=12, choices=STATUS)

    sold_amount = models.DecimalField(max_digits=15, decimal_places=1)

    profit_amount = models.DecimalField(max_digits=15, decimal_places=1)

    def save(self, *args, **kwargs):
        if self.status == 'sold':
            sum_invested = self.purchased_amount + ShippingDetails.price + MaintenanceDetails.price
            profit = self.sold_amount - sum_invested
            self.profit_amount = profit
            super().save(*args, **kwargs)

class ShippingDetails(models.Model):
    car = models.ForeignKey(CarAdd, related_name='shipping_details', on_delete=models.CASCADE)
    item = models.CharField(max_length=60)
    price = models.DecimalField(max_digits=15, decimal_places=1,)

class MaintenanceDetails(models.Model):
    car = models.ForeignKey(CarAdd, related_name='maintenance_details', on_delete=models.CASCADE)
    item = models.CharField(max_length=60)
    price = models.DecimalField(max_digits=15, decimal_places=1)

如果状态为“已售出”,如何计算利润金额并保存到Profit_amount字段

1 个答案:

答案 0 :(得分:0)

您需要汇总相关模型:

from django.db.models import Sum
from django.db.models.functions import Coalesce
sum_invested = self.purchased_amount 
               + self.shipping_details.aggregate(total_price=Coalesce(Sum('price'), 0))['total_price'] 
               + self.maintenance_details.aggregate(total_price=Coalesce(Sum('price'), 0))['total_price']