Django:使用模型方法(使用self)分配默认值

时间:2018-08-28 14:49:03

标签: django django-models

我正在使用模型内部的方法分配默认值:

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的默认值。

2 个答案:

答案 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

但是,如果确实可行,我还没有进行测试。