可调用未定义为django.db.models字段的默认值

时间:2015-06-18 07:02:50

标签: python django python-3.x django-models

我正在使用PyCharm 4.5.2,Django 1.8.2。

如果我将一个类定义为:

class User(models.Model):
    first_name = models.CharField(max_length=256)
    last_name = models.CharField(max_length=256)
    slug = models.SlugField(max_length=256, unique=True, default=make_slug)

    def make_slug(self):
        return self.first_name + self.last_name[0]

IDE突出显示default=make_slugmake_slug未定义。解释器同意,当开发服务器尝试刷新它时退出状态为1并且错误NameError: name 'make_slug' is not defined.

因为它只是一个可调用的名字,所以我不能传递参数。因此,如果我在类之外定义函数(移动到更高的范围并定义),我就不能使用类属性。我已经阅读了一些使用lambdas的建议,但是来自Django documentation的错误:

  

请注意,lambdas不能用于默认的字段选项   因为它们无法通过迁移进行序列化。看到了   其他警告的文件。

在模型中为默认值定义可调用的正确方法是什么。

2 个答案:

答案 0 :(得分:2)

您不应该使用此方法来设置默认值,而不是覆盖模型的save方法并在那里使用它。例如:

class User(models.Model):
    first_name = models.CharField(max_length=256)
    last_name = models.CharField(max_length=256)
    slug = models.SlugField(max_length=256, unique=True, default=uuid.uuid1)

    def make_slug(self):
        return self.first_name + self.last_name[0]

    def save(self, *args, **kwargs):
       self.slug = self.make_slug()
       super().save(*args, **kwargs)

答案 1 :(得分:1)

您收到此错误

MaxPerGroupProperty

因为您在定义之前引用了NameError: name 'make_slug' is not defined.。如果您将make_slug函数移到make_slug字段上方,则不会出现该错误。

但是,无法将任何参数传递给您用作默认值的callable,因此也无法正常工作。在尝试使用模型方法时,无法绕过该限制。

如果您需要访问模型实例来计算默认值,那么将slug方法中的值设置为ruddra建议是个好主意。请注意,您可能需要检查模型是否具有主键,以便您只在第一次创建实例时创建slug。