Django Empêcher les méthodes sensibles d'être appelées dans des modèles


Exemple

Lorsqu'un objet est exposé au contexte du modèle, ses méthodes sans arguments sont disponibles. Ceci est utile lorsque ces fonctions sont des "getters". Mais cela peut être dangereux si ces méthodes modifient certaines données ou ont des effets secondaires. Même si vous faites probablement confiance à l'auteur du modèle, il peut ne pas être conscient des effets secondaires d'une fonction ou penser à appeler le mauvais attribut par erreur.

Vu le modèle suivant:

class Foobar(models.Model):
    points_credit = models.IntegerField()

    def credit_points(self, nb_points=1):
        """Credit points and return the new points credit value."""
        self.points_credit = F('points_credit') + nb_points
        self.save(update_fields=['points_credit'])
        return self.points_credit

Si vous écrivez ceci, par erreur, dans un modèle:

 You have {{ foobar.credit_points }} points!

Cela augmentera le nombre de points à chaque appel du modèle. Et vous ne le remarquerez peut-être même pas.

Pour éviter cela, vous devez définir l'attribut alters_data sur True pour les méthodes qui ont des effets secondaires. Cela rendra impossible de les appeler à partir d'un modèle.

def credit_points(self, nb_points=1):
    """Credit points and return the new points credit value."""
    self.points_credit = F('points_credit') + nb_points
    self.save(update_fields=['points_credit'])
    return self.points_credit
credit_points.alters_data = True