2009-04-08 6 views
0

En utilisant Django, comment générer la valeur d'un champ la première fois qu'il est accédé? Ensuite, stocker la valeur sur le terrain.Comment générer la valeur d'un champ la première fois qu'il est accédé?

Dans mon cas c'est une image, mais ça pourrait être tout ce que je suppose. Ce dont j'ai besoin, c'est d'une fonction qui s'exécute avant que le champ soit accédé ou envelopper l'accès et en vérifiant la nullité, je le génère, ou quelque chose comme ça.

Répondre

3

Il y a un ticket getters and setters ouvert dans le djangoproject depuis quelques années, mais pas de chance. Je l'ai vu trois approches communes à la situation que vous décrivez:

  • Mettez votre champ de modèle à un autre nom, dites image_field, et d'écrire un getter/paire setter (en utilisant la syntaxe de Python property) appelé image dans votre objet qui interroge ce champ. Cela fonctionnera pour une utilisation occasionnelle par vos fonctions, mais tous les appels à partir de la structure elle-même ignorera évidemment votre getter/setter.

  • Créez votre propre sous-classe custom field pour travailler la magie pour vous si possible.

  • L'annulation de sauvegarde comme suggère ozanonay.

1

Y a-t-il une raison pour laquelle vous ne pourriez pas le faire lorsque l'objet est sauvegardé? Parce que ce serait trivialement facile à réaliser en remplaçant la méthode d'enregistrement dans le modèle concerné, par exemple:

def save(self, force_insert=False, force_update=False): 
    if not self.image: 
     self.image = foo 
    super(RelevantModel, self).save(force_insert, force_update) 

Bien sûr, s'il y a une différence pertinente pour vous entre le moment où l'objet est d'abord enregistré et temps que l'on accède à un champ particulier, cela ne résout pas le problème.

+1

Il ya deux raisons pour lesquelles je ne veux pas faire cela: 1) ce sont des données générées et il devrait être possible de supprimer ces données et de les régénérer à la demande (si l'algorithme de génération est amélioré, ces données ne sont pas sauvegardées). – Pablo

+1

2) parce que pour générer cette nouvelle image j'ai besoin d'une image dans le même enregistrement ce qui signifie que je dois valider le formulaire, l'enregistrer puis faire la génération, et si la génération échoue, il me reste un enregistrement validé . Il est plus logique de le générer à la demande. – Pablo

Questions connexes