faire des calcule entre des champs d'un modele

bonjour à tous,
pouvez vous me donner un lien ou des astuce pour faire des calculs(addition et multiplication)entre deux champs dans un model

Response from Google Translate:

Il serait utile que vous soyez plus précis sur ce que vous essayez exactement d’atteindre.

Les champs d’un modèle sont des attributs d’une classe qui fonctionnent exactement comme tout autre attribut serait utilisé dans n’importe quelle classe Python standard.

Si vous pouviez fournir des détails sur le problème spécifique que vous rencontrez, nous pourrions être en mesure de fournir une réponse plus précise.

And the original English:

It would be helpful if you were more specific with what exactly you’re trying to achieve.

Fields in a model are attributes on a class that function exactly like how any other attribute would be used in any standard Python class.

If you could supply details about the specific problem you’re encountering, we might be able to provide a more specific response.

j’ai trois champ un montant_devise,devise et montant_xaf, je souhaite que montat_xaf = montant*devise

From Google translate:

D’après ce que vous avez écrit :

montat_xaf = montant*devise

C’est une syntaxe Python parfaitement valide. Donc, je suppose que vous voulez plus d’informations que cela.

Mais vous n’avez pas fourni assez de contexte.

“Je veux…” - Quand ? Où? Pourquoi? Pour en faire quoi ? Est-ce pour le rendu dans un modèle ? Passer à un autre calcul ?
Quel est votre objectif ultime pour cela ?

Soyez précis et fournissez tous les détails pertinents sur ce que vous essayez d’accomplir.

And the original English:

From what you wrote:

montat_xaf = montant*devise

That’s perfectly valid Python syntax. So, I’m assuming you want more information than that.

But you have not provided nearly enough context.

“I want …” - When? Where? Why? To do what with it? Is this for rendering in a template? To pass along to another calculation?
What is your ultimate objective for this?

Be specific and provide all the relevant details about what you’re trying to achieve.

Qu’est ce que vous voulez faire avec le résultat du calcul ? Afficher ? Stocker ?

Par example si vous avez un modèle

class MonModele(models.Model):
    x = models.IntegerField(....)
    y = models.IntegerField(....)

    def xy(self):
        retrun self.montant * self.devise

Dans votre code quand vous avez un instance d’un objet MonModele vous pouvez accéder à la méthode xy pour obtenir le résultat du calcul.

création d’une instance de l’object MonModele

prix = MonModele.objects.create(x=2, y=5)

Dans le code:

resultat = prix.xy()

Est-ce que ca vous aide ?

voici mon modele:
je souhaite que mt_xaf = mt_devise* devise

class Dossier(models.Model):

statut=((‘Valider en Agance’,‘Valider en Agance’),
(‘Valider controle BEAC’,‘Valider controle BEAC’),
(‘Rejeter Controleur BEAC’,‘Rejeter Controleur BEAC’)
)

raison_sociale=models.CharField(max_length=50)
motif=models.ForeignKey(Motif,null=True,on_delete=models.SET_NULL)
devise=models.FloatField()
mt_devise=models.DecimalField(max_digits=70, decimal_places=2)
mt_xaf=models.PositiveIntegerField(default=1)
situation_cpt=models.CharField(max_length=10)
beneficiaire=models.CharField(max_length=50)
statut=models.CharField(max_length=50,choices=statut,default=‘Valider en Agance’)
create_time=models.DateTimeField(auto_now_add=True)

Il est vrai que l’objectif est flou … (attention au melange des types de champ FloatField, DecimalField et PositiveIntegerField…)

class Dossier(models.Model):
    # fields
    def save(self, *args, **kwargs):
        if self.mt_devise and self.devise:
            self.mt_xaf = self.mt_devise * self.devise
        super(Dossier, self).save(*args, **kwargs)

?

From Google Translate:

Ce que vous ne voulez pas faire, c’est stocker le résultat d’un calcul comme celui-ci dans votre base de données - du moins pas dans la couche Django. C’est une extrêmement mauvaise idée. (Cela enfreint les principes de la base de données consistant à maintenir l’intégrité et à fournir une source d’informations unique.) Plus précisément, dans ce cas, il existe plusieurs façons de mettre à jour l’un de ces champs sans passer par la méthode save - ce qui signifie désormais votre modèle est incorrect.

Lorsque vous avez une valeur dérivée d’autres champs dans votre modèle, vous souhaitez effectuer ce calcul lorsqu’il est nécessaire de l’utiliser, pas seulement pour les stocker.


And the original English:

What you do not want to do is store the result of a calculation like that in your database - at least not in the Django layer. This is an extremely bad idea. (It violates the database principles of maintaining integrity and providing a single source of information.) Specifically in this case, there are multiple ways in which one of those fields can be updated that do not go through the save method - which now means your model is incorrect.

When you have a value derived from other fields in your model, you want to perform that calculation when it is needed to be used, not just to store them.

ok, merci pour votre apport, mon besoin, c’est de pouvoir afficher le résultat dans une page html

Ma recommandation générale serait de créer une méthode de modèle pour ce champ. Cela ressemblerait à quelque chose comme:

def mt_xaf(self):
    return self.mt_devise * self.devise

Vous pourrez alors référencer mt_xaf dans votre modèle comme n’importe quel autre champ.


And the original English:

My general recommendation would be to create a model method for that field. It would look something like:

def mt_xaf(self):
    return self.mt_devise * self.devise

You would then be able to reference mt_xaf in your template like any other field.

… and wrap that using @property?

You can if you want. I never bother - I don’t see the value when the only usage is going to be a template reference.
Even if it’s being used elsewhere, I prefer it being explicitly obvious that this attribute is a derived value and not an intrinsic value.

Merci beaucoup, j’ai pu avoir le résultat attendu