python - 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),我可以执行同步数据库,但不能创建新的主题。
在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)

这在文档中的Overriding Model Methods中介绍。

本文翻译自 https://stackoverflow.com/questions/4380879/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python django django-models django-1.2


相关文章:

python - 如何根据回归模型的预测值计算标签?

python - 具有基于令牌的身份验证Django的定制用户模型

c++ - sqlite:检查读写器锁

python - GraphQL / Graphene用于Django模板中的后端调用

python - 使矩阵对称,就地与异地

python - 使用链接的Django模型快速计数

python - Django-有人通过贝宝付款时的通话功能

css - 加载后未应用Django admin CSS

python - django视图-获取ManyToMany字段的值

python - 如何修改Django模型?