Python Django 3模型中的动态默认值

Python Django 3模型中的动态默认值,python,django,Python,Django,也有类似的问题,但没有一个是基于Django 3的最新问题,所以这里是: 我使用生成一些独特的ID,因此在我的模型中 from nanoid import generate 然后 class Work(models.Model): title = models.CharField(max_length=200) body = models.TextField() published = models.BooleanField(False) date = mode

也有类似的问题,但没有一个是基于Django 3的最新问题,所以这里是:

我使用生成一些独特的ID,因此在我的模型中

from nanoid import generate
然后

class Work(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    published = models.BooleanField(False)
    date = models.DateTimeField()
    nanoid = models.CharField(max_length=15, default = generate(size=10) )
    
    
    def __str__ (self):
        return self.title
我的目标是确保每次添加新的工作帖子时都会生成一个新的nanoid。目前是相同的重复每次我试图通过管理添加一个新的工作


我读了一些关于创建自定义类的回复,但我在这里有点不知所措

您可以覆盖模型上的save方法来完成此操作,还必须创建一个helper函数来检查模型上的nanoid是否已经存在于持久性存储中

class Work(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    published = models.BooleanField(False)
    date = models.DateTimeField()
    nanoid = models.CharField(max_length=15)
    
    def save(self, *args, **kwargs):
        nanoid = generate_id()
        super(Work, self).save(*args, **kwargs)

    def __str__ (self):
        return self.title

# Helpers
def generate_id():
    """
    Generate nanoid unique code.
    """
    n_id = generate(size=10)
    while not is_available_code(n_id):
        n_id = generate(size=10)
    return n_id

def is_available_id(id):
    """
    Validate Id.
    """
    return not id_is_nanoid(id)

def id_is_nanoid(id):
    return Work.objects.filter(nanoid=id).exists()

如果将函数作为默认值传递,则它必须是不带参数的函数。您可以使用将
generate
转换为不接受参数且将
size=10设置为默认值的函数

from functools import partial

class Work(models.Model):
   ...
   nanoid = models.CharField(max_length=15, default=partial(generate, size=10))

非常优雅,谢谢:)!哦,这给了我AttributeError:“function”对象在迁移时没有属性“generate:(知道如何解决这个问题吗?