有一个具有字段的模型,该字段应该使用固定长度的随机标识符自动填充:
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)为了不确定生成值确实是唯一的,我希望在保存方法中重新生成它,如果这个值已经存在:
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属性的函数,而不对函数的名称进行硬编码?
发布于 2017-02-07 20:12:28
当然,您可以使用内省API来做到这一点:
Post._meta.get_field("identifier").default尽管如此,我认为拥有default一点意义都没有。无论如何,您要在save()中重写它,这有点误导,因为它实际上不是默认的。
还请注意,您的算法仍然有失败的情况。对于默认事务隔离级别,它不会阻止两个事务同时写入相同的值。当然,这是极不可能的。
https://stackoverflow.com/questions/42088761
复制相似问题