Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django始终提供相同的默认值_Django_Model_Default - Fatal编程技术网

django始终提供相同的默认值

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'),

我根据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'),
    ('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知道如何在实例化时调用它,而不是在导入时调用它。

我在这里也找到了答案。但是将此方法作为类的静态方法是一个好主意吗?