我正在使用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_slug
且make_slug
未定义。解释器同意,当开发服务器尝试刷新它时退出状态为1
并且错误NameError: name 'make_slug' is not defined.
因为它只是一个可调用的名字,所以我不能传递参数。因此,如果我在类之外定义函数(移动到更高的范围并定义),我就不能使用类属性。我已经阅读了一些使用lambdas的建议,但是来自Django documentation的错误:
请注意,lambdas不能用于默认的字段选项 因为它们无法通过迁移进行序列化。看到了 其他警告的文件。
在模型中为默认值定义可调用的正确方法是什么。
答案 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。