Python 从同一模型中的其他类获取模型属性

Python 从同一模型中的其他类获取模型属性,python,django,python-3.x,django-models,Python,Django,Python 3.x,Django Models,如何获得同一模型中另一类的价值? 我还可以使用属性吗? 我想在Stats类中使用Finance.net_income和Finance.net_margin。我试着找一个anwser,但我找不到,我也是django的新手 class Stats(models.Model): stock = models.ForeignKey(Stock, on_delete=models.CASCADE) shares_outstanding = models.FloatField(default

如何获得同一模型中另一类的价值?
我还可以使用属性吗? 我想在Stats类中使用Finance.net_income和Finance.net_margin。我试着找一个anwser,但我找不到,我也是django的新手

class Stats(models.Model):
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    shares_outstanding = models.FloatField(default=0)  

    @property
    def earnings_per_share(self):
        ####### ISSUE IS HERE #####
        return Finance.net_income / self.shares_outstanding

class Finance(models.Model):
    stock = models.ForeignKey(Stock, on_delete=models.CASCADE)
    total_revenue = models.FloatField(default=0) 
    operating_income = models.FloatField(default=0) 
    date = models.DateField(null=True, blank=True)
    net_income = models.FloatField(default=0) 
    cash = models.FloatField(default=0) 
    total_debt = models.FloatField(default=0) 

    @property
    def operating_margin(self):
        if self.total_revenue:
            now = (self.operating_income / self.total_revenue)*100
        else:
            now = 0
        return now

    @property
    def net_margin(self):
        if self.total_revenue:
            now = (self.net_income / self.total_revenue)*100
        else:
            now = 0
        return now
试着这样做:

@property
def earnings_per_share(self):
   total_earnings_per_share = 0 
   for finance in self.stock.finance_set.all():
         total_earnings_per_share += finance.net_income / self.shares_outstanding
   return total_earnings_per_share

好的,你不会得到一个金融实例,因为它是金融和股票之间的外键,这意味着一只股票可以有多个金融。

如果你想用与
Stat
s对象的
Stock
相同的
Stock
计算
金融
的总和,您可以使用以下公式进行计算:

from django.db.models import Sum

@property
def earnings_per_share(self):
    return Finance.objects.filter(
        stock_id=self.stock_id
    ).aggregate(
        total=Sum('net_income')
    )['total'] / self.shares_outstanding
如果没有所有
Stats
对象都有一个或多个
Finance
对象,那么
Sum
将返回
None
NULL
),在这种情况下,我们可能希望返回
0
。我们可以使用该功能来实现此目的:

from django.db.models import Coalesce, Sum, Value

@property
def earnings_per_share(self):
    return Finance.objects.filter(
        stock__stats=self
    ).aggregate(
        total=Coalesce(Sum('net_income'), Value(0))
    )['total'] / self.shares_outstanding
从django.db.models导入合并、求和、值
@财产
def每股收益(自身):
return Finance.objects.filter(
库存统计=自我
).合计(
合计=合并(总和(“净收入”),价值(0))

)['total']/self.shares\u pensible
一个
Stats
对象与
Finance
对象在这里是如何关联的?在
属性中
每股收益
你需要获得模型
Finance
的一个实例,并且一切都很好。两个类都在同一个模型中,那么我如何在其中获得一个实例呢?完美,我如何获得最新的财务信息?按日期排序是的,使用
order\u by(“-date”)[0]
:)或使用
from django.db.models import Coalesce, Sum, Value

@property
def earnings_per_share(self):
    return Finance.objects.filter(
        stock__stats=self
    ).aggregate(
        total=Coalesce(Sum('net_income'), Value(0))
    )['total'] / self.shares_outstanding