J'ai un modèle que je voudrais contenir un nom de sujet et ses initiales (les données sont quelque peu anonymisées et suivies par des initiales).
En ce moment, j'ai écrit
class Subject(models.Model):
name = models.CharField("Name", max_length=30)
def subject_initials(self):
return ''.join(map(lambda x: '' if len(x)==0 else x[0],
self.name.split(' ')))
# Next line is what I want to do (or something equivalent), but doesn't work with
# NameError: name 'self' is not defined
subject_init = models.CharField("Subject Initials", max_length=5, default=self.subject_initials)
Comme indiqué par la dernière ligne, je préférerais pouvoir stocker les initiales dans la base de données en tant que champ (indépendant du nom), mais cela est initialisé avec une valeur par défaut basée sur le champ de nom. Cependant, j'ai des problèmes car les modèles django ne semblent pas avoir de «soi».
Si je change la ligne en subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials)
, je peux faire la syncdb, mais je ne peux pas créer de nouveaux sujets.
Est-ce possible dans Django, avoir une fonction appelable donne une valeur par défaut à un champ en fonction de la valeur d'un autre champ?
(Pour les curieux, la raison pour laquelle je veux séparer les initiales de mon magasin séparément est dans de rares cas où les noms de famille bizarres peuvent être différents de ceux que je traque. Par exemple, quelqu'un d'autre a décidé que les initiales du sujet 1 nommé «John O'Mallory» sont "JM" plutôt que "JO" et souhaite le corriger, éditez-le en tant qu'administrateur.)
super().save(*args, **kwargs)
(sans lesSubject, self
arguments) comme dans l'exemple de la documentation référencée.