我有一个模型,希望包含一个主题名称及其首字母。(数据在某种程度上是匿名的,并且通过缩写来跟踪。)
现在,我写了
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,但不能创建新主题。
subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials)
在django中,有一个可调用函数会根据另一个字段的值为某个字段提供默认值,这是否可能?
(出于好奇,我想分开存储首字母缩写的原因是在极少数情况下,怪异的姓氏可能与我跟踪的名字不同。例如,其他人认为名为“ John O’Mallory”的姓名的首字母1是“ JM”而不是“ JO”,并希望以管理员身份对其进行修改。)
特当然有一个“自我”!只是你要尝试将模型类的属性定义为依赖于模型实例。这是不可能的,因为在定义类及其属性之前,实例就不存在(也不能存在)。
要获得所需的效果,请覆盖模型类的save()方法。对实例进行必要的任何更改,然后调用超类的方法进行实际保存。这是一个简单的例子。
def save(self, *args, **kwargs): if not self.subject_init: self.subject_init = self.subject_initials() super(Subject, self).save(*args, **kwargs)