有一个字段的模型应该使用固定长度的随机标识符自动填充:
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
属性的函数,而无需对函数名称进行硬编码?
答案 0 :(得分:2)
当然,您可以使用introspection API来执行此操作:
Post._meta.get_field("identifier").default
尽管如此,我认为根本没有default
。你无论如何都要在save()
覆盖它,这有点误导,因为它不是实际的默认值。
另请注意,您的算法仍然存在失败案例。使用默认事务隔离级别,它不会阻止两个事务同时写入相同的值。当然,这是极不可能的。