我有一个模型,希望包含一个科目名称及其首字母(他的数据有些匿名,并且通过首字母进行跟踪)。
现在,我写道
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)
如最后一行所示,我希望能够将姓名的缩写实际作为字段(与名称无关)存储在数据库中,但是会使用基于名称字段的默认值进行初始化。但是,由于Django模型似乎没有“自我”,我遇到了问题。
如果将行更改为subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials)
,则可以执行syncdb,但不能创建新主题。
在Django中,有一个可调用函数可以根据另一个字段的值为某个字段提供默认值,这是否可能?
(出于好奇,我想分开存储首字母缩写的原因是在极少数情况下,怪异的姓氏可能与我跟踪的名字不同。例如,其他人认为名为“ John O'Mallory”的姓名的首字母1是“ JM”而不是“ JO”,并希望以管理员身份对其进行修改。)
super().save(*args, **kwargs)
(不带Subject, self
参数),如参考文档中的示例所示。