一尘不染

Django模型字段默认基于相同模型中的另一个字段

django

我有一个模型,希望包含一个主题名称及其首字母。(数据在某种程度上是匿名的,并且通过缩写来跟踪。)

现在,我写了

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”,并希望以管理员身份对其进行修改。)


阅读 999

收藏
2020-03-29

共1个答案

一尘不染

特当然有一个“自我”!只是你要尝试将模型类的属性定义为依赖于模型实例。这是不可能的,因为在定义类及其属性之前,实例就不存在(也不能存在)。

要获得所需的效果,请覆盖模型类的save()方法。对实例进行必要的任何更改,然后调用超类的方法进行实际保存。这是一个简单的例子。

def save(self, *args, **kwargs):
    if not self.subject_init:
        self.subject_init = self.subject_initials()
    super(Subject, self).save(*args, **kwargs)
2020-03-29