django始终提供相同的默认值
我根据UTC时间生成了我的付款id,并在其中添加了4个随机字符。但当我调用该函数时,utc_now和random_string4似乎只执行了一次django始终提供相同的默认值,django,model,default,Django,Model,Default,我根据UTC时间生成了我的付款id,并在其中添加了4个随机字符。但当我调用该函数时,utc_now和random_string4似乎只执行了一次 class Payment(models.Model): PAYMENT_STATUS_CHOICES = ( ('P','Pending'), ('A','Paid'), ('C','Canceled'), ) PAYMENT_TYPE_CHOICES = ( ('E','Electrician'),
class Payment(models.Model):
PAYMENT_STATUS_CHOICES = (
('P','Pending'),
('A','Paid'),
('C','Canceled'),
)
PAYMENT_TYPE_CHOICES = (
('E','Electrician'),
('S','Salesman'),
)
def __unicode__(self):
return '%s %s %s %s' % (self.payment_id,str(self.record_time),self.get_payment_type_display(),self.payment_status)
led_gu5_3_price = models.DecimalField(max_digits=10,decimal_places=2)
led_gu10_price = models.DecimalField(max_digits=10,decimal_places=2)
cfl_bc_price = models.DecimalField(max_digits=10,decimal_places=2)
cfl_es_price = models.DecimalField(max_digits=10,decimal_places=2)
cfl_sbc_price = models.DecimalField(max_digits=10,decimal_places=2)
cfl_ses_price = models.DecimalField(max_digits=10,decimal_places=2)
initial = models.DecimalField(max_digits=10,decimal_places=2)
record_time = models.DateTimeField(default=utc_now(),editable=False)
payment_id = models.CharField(max_length=10,default=utc_now().strftime('%y%m%d')+random_string(4),editable=False)
payment_status = models.CharField(max_length=1,choices=PAYMENT_STATUS_CHOICES,default='P')
payment_type = models.CharField(max_length=1,choices=PAYMENT_TYPE_CHOICES)
当我在终端测试时,输出如下:
>>> from payment_sys.models import *
>>> payments = [Payment(led_gu5_3_price = 0, led_gu10_price=0,cfl_bc_price = 0, cfl_es_price=0,cfl_sbc_price = 0,cfl_ses_price = 0,initial = 0,payment_type ='E') for i in xrange(3)]
>>> payments
[<Payment: 140801ZKGI 2014-08-01 16:32:36.158811+00:00 Electrician P>, <Payment: 140801ZKGI 2014-08-01 16:32:36.158811+00:00 Electrician P>, <Payment: 140801ZKGI 2014-08-01 16:32:36.158811+00:00 Electrician P>]
可以看出,时间是一样的,随机字符串也是一样的。我希望每次创建新的支付对象时都执行utc_now和random_string4。您需要使用可调用的,而不是值
def default_payment_id():
return utc_now().strftime('%y%m%d')+random_string(4)
payment_id = models.CharField(max_length=10,default=default_payment_id)
请注意,默认情况下没有调用括号:Django知道如何在实例化时调用它,而不是在导入时调用它。我在这里也找到了答案。但是将此方法作为类的静态方法是一个好主意吗?