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

标签 python django django-models

我有一个模型,我想包含一个主题名称和他们的首字母缩写(他的数据有些匿名并通过首字母缩写进行跟踪)。

现在,我写了

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 模型似乎没有“ self ”。

如果我将行更改为 subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials),我可以执行 syncdb,但无法创建新主题。

这在 Django 中是否可能,让一个可调用函数根据另一个字段的值为某个字段提供默认值?

(出于好奇,我想分开我的商店首字母缩写的原因是在极少数情况下奇怪的姓氏可能与我正在跟踪的姓氏不同。例如,其他人决定主题 1 命名为“John O'Mallory "首字母是 "JM"而不是 "JO"并且想修复以管理员身份编辑它。)

最佳答案

模特当然有“ self ”!只是您试图将模型类的属性定义为依赖于模型实例;这是不可能的,因为在您定义类及其属性之前,该实例不(也不能)存在。

为了得到你想要的效果,重写模型类的save()方法。对实例进行必要的更改,然后调用父类(super class)的方法进行实际保存。这是一个简单的例子。

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 中有介绍在文档中。

关于python - Django 模型字段默认基于同一模型中的另一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4380879/

相关文章:

python - 使用 AUTH_USER_MODEL 覆盖 django 用户

django - 如何重写自定义管理器类中的 .update() 方法

python - 使用正则表达式随机化 "<"和 ">"符号之间定义的元素位置

javascript - 错误 : The shape of dict ['input' ] provided in model.execute(dict) 必须是 [1,224,224,3],但实际上是 [1,244,244,3]

django - 在 Django 中动态更改 QuerySet 对象

python - 如何在基于类的 View 中使用 django-paypal

python - Django:基于一对一字段限制用户 "can change/delete"权限

Django 3 : AttributeError: 'AdminSite' object has no attribute 'Register'

python - 如何在 Keras 中实现恒定神经元?

python - DEBUG 为 False 时错误处理程序不触发