每次将模型对象保存到数据库时,创建一个随机字符串

时间:2018-11-07 10:58:44

标签: django django-models

在我的models.py中,我有:

export function foo() {
     setTimeout(() => {
        window.open('http://google.com');
    }, 0);
 }

describe('foo', () => {
    beforeEach(() => {
        jest.useFakeTimers();
        global.open = jest.fn();
    });

    it('calls open', () => {
        foo();

        expect(setTimeout).toHaveBeenCalledTimes(1);
        expect(global.open).toBeCalled(); //FAILING
    });
});

在我的django shell中,我尝试了以下操作:

def MakeOTP():
    import random,string
    return ''.join(random.choices(string.digits, k=4))


class Prescriptionshare(models.Model):
    prid = models.AutoField(primary_key=True, unique=True)
    customer = models.ForeignKey(
        customer, on_delete=models.CASCADE, null=True)
    time = models.DateTimeField(default=timezone.now)
    checkin =models.ForeignKey(Checkins, on_delete=models.CASCADE, null=True)
    otp = models.CharField(max_length=5, default=MakeOTP())

问题是每次执行此操作时,我都会在otp字段中得到相同的字符串。字符串没有随机变化。 为什么会这样?

1 个答案:

答案 0 :(得分:5)

() 中删除 default=MakeOTP()

class Prescriptionshare(models.Model):
    # your code
    otp = models.CharField(max_length=5, default=MakeOTP) # here, remove the "()"

在模型中进行更改后,您应该迁移数据库


为什么会这样?
如果使用 MakeOTP() ,则Django会获取函数的输出,就好像您使用 MakeOTP (不带括号)时,Django会将其视为< strong> 可调用函数

也就是说,当使用括号时,方法在运行迁移后即被调用,并且其值 用作默认值 ;而当不使用括号时, 在创建对象时每次调用的功能参考