Django,随机化模型的"默认"参数

Hel*_*nar 8 django django-models

我想将"default"值设置为我的Promotion模型的promotion_code部分的随机生成的String,因为使用了code_generate函数.

以下代码的问题似乎是default=code_generate()每个服务器启动时生成此随机字符串,从而分配相同的值.我可以通过管理面板看到,每次我尝试生成一个新的促销时,它都会给我完全相同的字符串.

#generate a string, which is not already existing in the earlier Promotion instances
def code_generate():
    while 1:
        from django.conf import settings
        import random, string
        prom_code = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6))
        try:
            Promotion.objects.get(promotion_code=prom_code)
        except:
            return prom_code

class Promotion(models.Model):
    purchase = models.ForeignKey('Purchase')
    promotion_code = models.CharField(max_length=20,unique=True,default=code_generate())
Run Code Online (Sandbox Code Playgroud)

我该如何随意制作?

问候

Hel*_*nar 24

你需要传递一个callable default,而不是调用callable:

promotion_code = models.CharField(max_length=20,unique=True,default=code_generate)
Run Code Online (Sandbox Code Playgroud)

  • 只是对于那些想知道为什么会出现这种情况的人来说,当你在可调用函数中包含`()`时,就会在定义模型时调用它.因此,该调用**的**结果成为默认值 - 因此每次都是相同的.没有括号,默认是可调用本身,Django知道每次调用它以获得正确的(不同的)值. (8认同)
  • 有趣的是,当South冻结模型时,运行callable并将其返回值冻结到模式迁移中`db.create_table(...`语句)中的`default =`参数. (2认同)