0
votes

Comment implémenter les méthodes de modèle django

J'essaie de créer un système dans lequel nous exécutons l'amortissement de tous les actifs de la base de données. Les modèles d'actifs sont définis comme suit:

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

Comment puis-je implémenter la formule d'amortissement dans les modèles, par exemple Monthly_Depréciation = Asset_Cost / 3/12 et Current_Cost=Asset_Cost-Monthly_Depréciation?


2 commentaires

une note ici est que les attributs des classes devraient utiliser snake_case selon pep8 et cela donne une lisibilité au code, vous connaissez l'attribut quand vous le voyez simplement parce qu'il est nommé d'une manière qui le dit


La deuxième remarque est stackoverflow.com/help/how-to-ask car cette question est très simple et la réponse est une recherche sur Google


3 Réponses :


0
votes

Vous pouvez le faire en créant simplement la méthode dans la classe de modèle.

my_asset.get_depreceation()

Les classes de modèle peuvent avoir des méthodes normales et devraient avoir des méthodes fonctionnant sur ce modèle. Vous pouvez l'utiliser en appelant simplement la méthode comme vous le feriez normalement pour n'importe quel objet 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_depreceation(self):
        depreceation = # Your formula here. You can use any the model fields using self
        return depreceation


0 commentaires

0
votes

Le modèle

en plus d'être une instance de base de données se comporte également comme un objet Python standard, vous définissez donc simplement des méthodes à l'intérieur de la classe. Dans votre schéma, l'amortissement mensuel est défini comme un attribut de votre modèle, mais s'il dépend d'un autre champ, il est préférable de définir une méthode simple qui renvoie la valeur nécessaire, par exemple:

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

appelez simplement le méthode chaque fois que vous en avez besoin. Et rappelez-vous que la convention suggère d'utiliser des minuscules sur les attributs pour améliorer votre connaissance de Python, lisez le lien


0 commentaires

0
votes

Tout d'abord, vous devez faire la distinction entre le calcul des valeurs Monthly_Depréciation et Current_Cost dans le code python, et les avoir dans votre base de données.

Calculez-les dans la demande de code pour ajouter des méthodes correspondantes comme:

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

Et puis vous devriez pouvoir les appeler:

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

Cependant cela ne mettrait pas à jour les valeurs de la base de données . Pour mettre à jour, vous souhaitez modifier explicitement les champs du modèle et enregistrer le modèle ensuite. Cela pourrait être inclus dans la méthode de la classe Asset :

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

Après avoir appelé ce update_costs , vous obtiendrez l'entrée dans la base de données mise à jour:

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


0 commentaires