繁体   English   中英

将 django 中的两个字段相乘

[英]Multiply two fields in django

我有两种不同的型号

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)

我想将 Part 的pricepo_quantity ,结果显示在amount中。 例如

金额 = 价格 * po_quantity

有人可以帮我解决这个问题吗?

由于amount完全取决于pricepo_quantity ,因此您最好为此使用属性。 否则你会引入数据重复 因此,您可以将其实现为:

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

如果您需要在过滤时使用amount ,您可以使用.annotate(…) [Django-doc]代替,并在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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM