2015-11-19 24 views
0

我有一个代码生成器是这样的:Python不产生新的代码

extra_funcs.py

def id_generator(size=4, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for _ in range(size)) 

而且有一个Django模型是这样的:

models.py

from .extra_funcs import id_generator 

def generator(digit): 
    ret = id_generator(digit) 
    return ret 

class Service(models.Model): 
    business = models.ForeignKey(Business) 
    sub_service = models.ForeignKey('self', blank=True, null=True, related_name='sub_services') 
    code = models.CharField(max_length=20, default=generator(6), blank=False, editable=False) 
    en_title = models.CharField(max_length=50, blank=False) 
    update = models.DateTimeField(auto_now=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 

我不知道为什么它不会产生新的值,它只是每次都返回一次值!我该怎么办?

回答

2

你需要通过一个可调用的默认,不会调用调用:

from .extra_funcs import id_generator 

def generator: 
    ret = id_generator(6) 
    return ret 

class Service(models.Model): 
    business = models.ForeignKey(Business) 
    sub_service = models.ForeignKey('self', blank=True, null=True, related_name='sub_services') 
    code = models.CharField(max_length=20, default=generator, blank=False, editable=False) 
    en_title = models.CharField(max_length=50, blank=False) 
    update = models.DateTimeField(auto_now=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 
1

Django的检查,如果default是调用。

generator(6)不可调用,因为返回值和此值分配给默认值。

尝试lambda

default=lambda: generator(6) 

你并不需要定义generator功能

default=lambda: id_generator(6) 

可惜的是,这是不推荐的,因为拉姆达不能迁移序列化。请参阅https://docs.djangoproject.com/en/dev/ref/models/fields/#default(谢谢@knbk)

+3

请注意,lambda不能被序列化。这不会与迁移一起使用,迁移序列化字段及其所有参数。 – knbk

1

您不能拥有default=function(value),因为语句在第一个读取分析周期中立即执行,所以只能有default=function

所以你不能传递一个callable。以下是您如何重写代码:

from .extra_funcs import id_generator 

def generator(): 
    digit = 6 
    ret = id_generator(digit) 
    return ret 

class Service(models.Model): 
    business = models.ForeignKey(Business) 
    sub_service = models.ForeignKey('self', blank=True, null=True, related_name='sub_services') 
    code = models.CharField(max_length=20, default=generator, blank=False, editable=False) 
    en_title = models.CharField(max_length=50, blank=False) 
    update = models.DateTimeField(auto_now=True) 
    timestamp = models.DateTimeField(auto_now_add=True)