小编典典

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

python

我有一个模型,希望包含一个科目名称及其首字母(他的数据有些匿名,并且通过首字母进行跟踪)。

现在,我写道

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


阅读 156

收藏
2020-12-20

共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-12-20