我有一个模型,我想包含一个主题名称和他们的首字母。(数据有点匿名化,并用首字母进行跟踪。)
现在,我写了
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中,有一个可调用函数根据另一个字段的值为某个字段提供默认值,这可能吗?
(出于好奇,我之所以要将商店的名字缩写分开,是因为在极少数情况下,奇怪的姓氏可能与我跟踪的姓氏不同。E、 例如,其他人认为主题1名为“John O'Mallory”的首字母是“JM”而不是“JO”,并希望以管理员的身份修改它。)
模特当然有“自我”!只是您试图将模型类的属性定义为依赖于模型实例;这是不可能的,因为实例在定义类及其属性之前不存在(也不存在)。
若要获得所需的效果,请重写模型类的save()方法。对实例进行任何必要的更改,然后调用超类的方法来执行实际的保存。这里有一个简单的例子。
这在文档中的Overriding Model Methods中有介绍。
我不知道有没有更好的方法,但是你可以use a signal handler来the ^{} signal :
使用Django signals,这可以很早地完成,方法是从模型接收the ^{} signal 。
一旦类对实例完成初始化,它就会发送
post_init
信号。这样,在测试是否设置了不可为空的字段之前,实例获取name
的值。相关问题 更多 >
编程相关推荐