Django模型方法中的引用字段的默认函数

时间:2017-02-07 11:30:38

标签: django django-models

有一个字段的模型应该使用固定长度的随机标识符自动填充:

from django.db import models
from django.utils.crypto import get_random_string

def get_random_string_fixed():
    return get_random_string(length=20)

class Post(models.Model):
    identifier = models.CharField(unique=True, default=get_random_string_fixed)

为了不确定生成值确实是唯一的,我想在save方法中重新生成它,如果这样的值已经存在:

def save(self, *args, **kwargs):
    if not self.pk:
        while Post.objects.filter(identifier=self.identifier).exists():
            self.identifier = get_random_string_fixed()
    super().save(*args, **kwargs)

此实现的问题是get_random_string_fixed方法中的save()是硬编码的。如果在某些时候我决定为这个字段选择一个不同的默认函数,我将不得不在几个地方改变它,这是一个不好的做法。

有没有一种方法可以在模型的方法中引用分配给字段的default属性的函数,而无需对函数名称进行硬编码?

1 个答案:

答案 0 :(得分:2)

当然,您可以使用introspection API来执行此操作:

Post._meta.get_field("identifier").default

尽管如此,我认为根本没有default。你无论如何都要在save()覆盖它,这有点误导,因为它不是实际的默认值。

另请注意,您的算法仍然存在失败案例。使用默认事务隔离级别,它不会阻止两个事务同时写入相同的值。当然,这是极不可能的。