Как реализовать django методы модели - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь построить систему, в которой мы запускаем амортизацию для всех активов в базе данных. Модели активов определены следующим образом:

class Asset(models.Model):  
    Asset_description=models.TextField(max_length=100)
    Tag_number=models.TextField(unique=True)
    Asset_Cost=models.IntegerField(default=0)
    Monthly_Depreciation=models.IntegerField(default=0)
    Current_Cost=models.IntegerField(default=0) 

    def __str__(self):
        return self.Asset_description

Как я могу реализовать формулу амортизации в моделях, например, Monthly_Depreciation=Asset_Cost/3/12 и Current_Cost=Asset_Cost-Monthly_Depreciation?

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020
Модель

помимо того, что она является экземпляром базы данных, также ведет себя как стандартный объект python, поэтому вы просто определяете методы внутри класса. В вашей схеме определен ежемесячный износ как атрибут вашей модели, но если он зависит от другого поля, лучше определить простой метод, который возвращает нужное значение, например:

class Asset(models.Model):  
    Asset_description=models.TextField(max_length=100)
    Tag_number=models.TextField(unique=True)
    Asset_Cost=models.IntegerField(default=0)
    # you don't need it anymore 
    # btw if you divide somthing by 3/12 it's better to use FloatField
    # Monthly_Depreciation=models.IntegerField(default=0)
    Current_Cost=models.IntegerField(default=0)

    def get_monthly_depreciation(self):
        return self.Asset_description/3/12

    def __str__(self):
        return self.Asset_description

, просто вызывайте метод всякий раз, когда вам это нужно. И помните, что соглашение предлагает использовать строчные буквы для атрибутов, чтобы улучшить ваше python знание прочитав ссылку

0 голосов
/ 10 апреля 2020

Во-первых, вам нужно различить guish между вычислением Monthly_Depreciation и Current_Cost значений в коде python и их наличием в вашей базе данных.

Рассчитайте их в коде запросить добавление соответствующих методов, таких как:

class Asset(models.Model):  
    Asset_description=models.TextField(max_length=100)
    Tag_number=models.TextField(unique=True)
    Asset_Cost=models.IntegerField(default=0)
    Monthly_Depreciation=models.IntegerField(default=0)
    Current_Cost=models.IntegerField(default=0) 

    def __str__(self):
        return self.Asset_description

    def get_monthly_deprecation(self):
        return self.Asset_Cost / 3.0 / 12.0

    def get_current_cost(self):
        return self.Asset_Cost - self.Monthly_Depreciation

И тогда вы сможете вызывать их:

asset: Asset = ...
monthly_deprecation = asset.get_monthly_deprecation()
current_cost = asset.get_current_cost()

Однако , что не обновит значения в базе данных . Для обновления вы хотите явно изменить поля модели и затем сохранить модель. Это может быть включено в метод класса Asset:

class Asset(models.Model):
   ...
   def update_costs(self):
       self.Monthly_Depreciation = self.get_monthly_deprecation()
       self.Current_Cost = self.get_current_cost()
       self.save()  # This method will execute the actual UPDATE SQL statement

После вызова этого update_costs вы получите обновленную запись в базе данных:

asset: Asset = ...
asset.update_costs()
# Now both the model and the database should contain
# the calculated values, so you could use them as:
asset.Monthly_Deprecation
asset.Current_Cost
0 голосов
/ 10 апреля 2020

Это можно сделать, просто создав метод в классе модели.

class Asset(models.Model):  
    Asset_description=models.TextField(max_length=100)
    Tag_number=models.TextField(unique=True)
    Asset_Cost=models.IntegerField(default=0)
    Monthly_Depreciation=models.IntegerField(default=0)
    Current_Cost=models.IntegerField(default=0) 

    def __str__(self):
        return self.Asset_description

    def get_depreceation(self):
        depreceation = # Your formula here. You can use any the model fields using self
        return depreceation

Классы моделей могут иметь обычные методы и должны иметь методы, работающие с этой моделью. Вы можете использовать это, просто вызывая метод, как обычно, для любого python объекта

my_asset.get_depreceation()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...