所以我正在使用python secrets库,以便生成令牌,因此我想像这样将其添加为默认值
SELECT t.*
FROM table t
WHERE EXISTS (SELECT 1 FROM table t1 WHERE t1.supplierid = t.supplierid AND t1.materialid <> t.materialid);
奇怪的是它将生成43个字符而不是32个字符,所以有人可以帮助我理解为什么吗?
谢谢
答案 0 :(得分:1)
该default
参数必须指向 callable ,而不是带有参数的函数调用(仅在Django启动时才被评估一次)。您需要编写自己的包装函数,然后引用它。例如:
def my_secret():
return secrets.token_urlsafe(32)[:32] # Return only the first 32 characters.
#...
token=models.CharField(max_length=32, default=my_secret)
请参阅此答案:https://stackoverflow.com/a/12654998/4082726
关于长度:token_urlsafe
的参数是字节的数量,而不是字符。根据{{3}},这意味着每个字节大约1.3个字符,因此32 * 1.3 =〜42。