Получить атрибут модели из другого класса в той же модели - PullRequest
0 голосов
/ 30 ноября 2018

Как получить значение другого класса в той же модели?
Могу ли я также использовать свойства?Я хочу использовать Finance.net_income и Finance.net_margin внутри класса Stats.Я пытался найти ответ, но я не смог его найти, я также новичок в 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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Если вы хотите вычислить сумму Finance s с теми же Stock, что и Stock Stat s объекта, вы можете рассчитать это с помощью:

from django.db.models import Sum

@property
def earnings_per_share(self):
    return Finance.objects.filter(
        stock_id=self.stock_id
    ).aggregate(
        total=<b>Sum('net_income')</b>
    )['total'] / self.shares_outstanding

или более описательный фильтр:

from django.db.models import Sum

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

Если не все Stats объекты имеют один или несколько Finance объектов, то Sum вернет None (NULL), в этом случае мы, вероятно, хотим вернуть 0.Для этого мы можем использовать функцию Coalesce [Django-doc] :

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

@property
def earnings_per_share(self):
    return Finance.objects.filter(
        stock__stats=self
    ).aggregate(
        total=<b>Coalesce(</b>Sum('net_income')<b>, Value(0))</b>
    )['total'] / self.shares_outstanding
0 голосов
/ 30 ноября 2018

Попробуйте так:

@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

Ну, вы не получите ни одного экземпляра Finance, потому что это внешний ключ между финансами и акциями, то есть одна акция может иметь несколько финансов.

...