如何访问另一个模型的数据库,以便在django中的当前模型字段中执行一些计算?

dojqjjoe  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(275)

首先,这里提供了这个示例项目,以便任何人都可以查看它,并让我知道哪里出了问题。
我有两种型号, Package 和应收帐款。在包中,有一个字段total_package,在应收账款中,最初有两个字段,折扣和批准的_package。我想访问总的\u包,并从中减去折扣以自动填充已批准的\u包字段。如果您查看项目的test.js文件,我试图使用js实现同样的效果,但这并没有实现我的意图。我不知道哪里出了问题。我还想学习如何使用纯django方式实现这一点。有人能帮我吗?
模型:

class Package(models.Model):
    rt_number=ForeignKey(Patient, on_delete=CASCADE)
    diagnosis=models.ForeignKey(Diagnosis, on_delete=CASCADE)
    treatment=ForeignKey(Treatment, on_delete=CASCADE)
    patient_type=ForeignKey(PatientType, on_delete=CASCADE)
    date_of_admission=models.DateField(default=None)
    max_fractions=models.IntegerField(default=None)
    total_package=models.DecimalField(max_digits=10, decimal_places=2)

class Receivables(models.Model):
    rt_number=ForeignKey(Patient, on_delete=CASCADE)
    discount=models.DecimalField(max_digits=9, decimal_places=2, default=None)
    approved_package=models.DecimalField(max_digits=10, decimal_places=2, default=None)
    proposed_fractions=models.IntegerField()
    done_fractions=models.IntegerField()
    base_value=models.DecimalField(max_digits=10, decimal_places=2)
    expected_value=models.DecimalField(max_digits=10, decimal_places=2)

希望在这个问题上得到一些帮助。提前谢谢。

67up9zun

67up9zun1#

首先,您需要从包的外键访问相应包对象的total_包。然后,您可以根据需要执行计算。比如,如果r1是一个对象,它通过一个外键链接到package对象,那么我们可以这样做。

r1.approved_package = r1.package.total_package - r1.discount
r1.save()

注意-执行此操作之前,请确保r1链接到包对象

vkc1a9a2

vkc1a9a22#

在这两个类中,您都有一个公共字段,即rt_编号。因此,您可以设置一个属性,从可接收的模型类中获取一个包对象,并使用它来计算或执行任何您想要执行的操作。
在可接收类中:

from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned

class Receivables(models.Model):
    rt_number=ForeignKey(Patient, on_delete=CASCADE) # This is the common field in both class
    .....

    @property
    def package(self):
        """Return a package object or None if not exists"""
        try:
            return Package.objects.get(rt_number=self.rt_number)
        except ObjectDoesNotExist:
            return None
        except MultipleObjectsReturned:
            # You'll need to write some code to know what package to use
            # By example, return last Package
            return Package.objects.filter(rt_number=self.rt_number).last()

    def calculate_aproved_discount(self):
        """Calculates the discount taken the package as reference"""
        if(self.package):
            # make here your calculations
            return self.package.total_package - self.discount
        else: # package does not exists
            # You can not calculate the approved package
            return 0 # or whatever you want in these case

    # Overrides django model save method to autocalculate the discount when object is saved
    def save(self, *args,**kwargs):
        self.aproved_package = self.calculate_aproved_discount() # Calculate aproved_discount field
        super(Receivables, self).save(*args,**kwargs) # call save in ancestror

另外,我认为total_包不应该是模型字段的一部分,而应该是一个简单的方法或属性(如def包),并且只在需要时计算,而不是每次保存对象时计算。但由于某些原因,您可能需要存储它。而且,这一点很重要,如果患者只能有一个包模型关联,请更改一对一关系的rt_编号。

相关问题