我正在使用模型内部的方法分配默认值:
class Discussion(models.Model):
# attributes ...
def __str__(self):
return str(self.id) + ". " + self.title
def class_name(self):
return self.__class__.__name__
discussion_type = models.CharField(max_length = 50, default = self.class_name())
class TechDiscussion(Discussion):
# ...
class ScienceDiscussion(Discussion):
# ...
在我的Django应用中,用户只能创建科学或技术讨论。因此,discussion_type
应该是"TechDiscussion"
或"ScienceDiscussion"
。
服务器返回错误NameError: name 'self' is not defined
,是指分配给discussion_type
的默认值。
答案 0 :(得分:1)
正如Bear Brown在评论中建议的那样,一种解决方案是重写save()
类的Discussion
方法,该方法也已记录在here中。我删除了discussion_type
分配并添加了覆盖,如文档所示:
class Discussion(models.Model):
# attributes ...
def __str__(self):
return str(self.id) + ". " + self.title
def class_name(self):
return self.__class__.__name__
def save(self, *args, **kwargs):
self.call_type = self.class_name()
super().save(*args, **kwargs)
答案 1 :(得分:0)
这无法使用,因为“讨论”模型将拥有自己的数据库表-因此您需要使其抽象。仍然会尝试在没有对象的地方访问self,因此将其替换为类名。而且,仅在保存时,它就不会在赋值时评估函数,因此只需在其中添加函数对象(不带括号)即可。
class Discussion(models.Model):
# attributes ...
def __str__(self):
return str(self.id) + ". " + self.title
def class_name(self):
return self.__class__.__name__
discussion_type = models.CharField(max_length = 50, default = Discussion.class_name)
class Meta:
abstract = True
但是,如果确实可行,我还没有进行测试。