J'ai un modèle:Comment faire pour qu'un champ de modèle Django soit calculé lors de l'exécution?
class Person (models.Model):
name = models.CharField()
birthday = models.DateField()
age = models.IntegerField()
Je veux faire le terrain age
à se comporter comme une propriété:
def get_age (self):
return (datetime.datetime.now() - self.birthday).days // 365
age = property (get_age)
mais en même temps, je dois age
être un vrai champ, donc je peux trouvez-le dans Person._meta.fields
, et attribuez-lui des attributs: age.help_text = "Age of the person"
, etc.
De toute évidence, je ne peux pas simplement remplacer la méthode Person.save()
pour calculer et stocker age
dans la base de données, car il se produira inévitablement mal plus tard (en fait, il ne devrait pas être stocké dans la base de données du tout).
En fait, je n'ai pas besoin de setters maintenant, mais une bonne solution doit avoir une fonction de réglage.
Est-il possible dans Django, ou probablement il y a une approche plus pythonique et djangoic à mon problème?
Pourquoi se redéfinissant la méthode de sauvegarde fonctionne pas? –
Parce que cela peut être faux la prochaine fois que nous obtenons une instance de modèle. C'est un exemple simple, j'ai en réalité des champs plus complexes, dont les valeurs changent de façon imprévisible, étant dépendantes de plusieurs autres facteurs. –