Mam model, w którym chciałbym, aby zawierał nazwiska badanych i ich inicjały (dane są nieco anonimizowane i śledzone według inicjałów).
Właśnie teraz napisałem
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)
Jak wskazano w ostatnim wierszu, wolałbym mieć możliwość zapisania inicjałów w bazie danych jako pola (niezależnie od nazwy), ale jest to inicjalizowane wartością domyślną opartą na polu nazwy. Jednak mam problemy, ponieważ modele django nie wydają się mieć „ja”.
Jeśli zmienię linię na subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials)
, mogę wykonać syncdb, ale nie mogę tworzyć nowych tematów.
Czy jest to możliwe w Django, gdy funkcja wywoływalna daje wartość domyślną dla jakiegoś pola na podstawie wartości innego pola?
(Dla ciekawości powodem, dla którego chcę osobno oddzielić inicjały mojego sklepu są rzadkie przypadki, w których dziwne nazwiska mogą mieć inne niż te, które śledzę. Na przykład ktoś inny zdecydował, że inicjały podmiotu 1 o imieniu „John O'Mallory” są „JM” zamiast „JO” i chce naprawić to jako administrator).
super().save(*args, **kwargs)
(bezSubject, self
argumentów), jak w przykładzie w dokumentacji, do której się odwołuje.