python - 未为 django.db.models 字段默认定义可调用

标签 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_slug,其中 make_slug 未定义。解释器同意,当开发服务器尝试刷新时,它会以状态 1 退出,并出现错误 NameError: name 'make_slug' is not Defined。

因为它只是可调用的名称,所以我无法传递参数。因此,如果我在类外部定义函数(以进入更高的范围并进行定义),我将无法使用类属性。我读过一些使用 lambda 的建议,但来自 Django documentation这是错误的:

Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.

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

最佳答案

您不应使用此方法来设置默认值,而应重写模型的保存方法并在那里使用它。例如:

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)

关于python - 未为 django.db.models 字段默认定义可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30908562/

相关文章:

django - 如何为基于类的 View 编写装饰器——基于 View 对象的权限

postgresql - 如何防止 sql alchemy 将 None 值插入字段?

python : How to make a script enter and exit minicom terminal?

python - Django form.save() 到另一个类/函数

python - 发布到 Facebook 个人资料墙 + Facebook.py + Python + App Engine

javascript - 如何将点击添加到 html 中的产品列表并获取点击到 firestore 的项目

python - 打印 ÆØÅ(大写)字母

python - 迭代元组列表

c++ - Boost 没有静态链接到 boost::python 共享对象

python - "[w for w in word_tokens if..."在 Python 中是什么意思?