2015-06-24 2 views
0

Почему в этих двух атрибутах модели upload, time оценивается каждый раз Я добавляю новый экземпляр, но string не изменяется вообще? (inUnixTime дает мне текущий DateTime в Unix времени)Оценка значения атрибута модели Django в вызываемом

class upload(models.Model): 

    #... 
    time = models.IntegerField(default=inUnixTime) 
    string = models.CharField(max_length=255, default=str(inUnixTime())) 
    #... 

def inUnixTime(t=None): 
    if not t: 
     t = datetime.datetime.now() 
    return int(time.mktime(t.timetuple())) 

PS. Если я использую только вызываемый, делая

string = models.CharField(max_length=255, default=str(inUnixTime)) 

тогда я получаю адрес памяти объекта, а не время Unix в виде строки.

Спасибо заранее!

ответ

3

str(inUnixTime()) возвращает строку, точно так же, как u'A string' - это не подлежащее вызову, поэтому оно не изменится. Когда вы используете функцию inUnixTime по умолчанию, она является вызываемой, поэтому она вызывается каждый раз.

То, что вы, вероятно, хотите, это:

def string_default(): 
    return str(inUnixTime()) 

, а затем:

string = models.CharField(max_length=255, default=string_default) 
+0

Спасибо! он работает, вы не знаете, сколько часов я потратил на это ... Большое спасибо ... Я также дам вам голосование не только за принятие ... – pebox11

+0

Однако мне нужно отменить галочку принятие я дал вам из-за этого: https://docs.djangoproject.com/en/dev/ref/models/fields/#default, в котором говорится, что «... lambdas нельзя использовать для параметров поля, таких как default, потому что они не могут быть сериализованный миграциями ». – pebox11

+0

Ах да, вы правы. Это изменилось в 1.7, когда были введены миграции джанго. Я исправил свой ответ. – Greg

-1

Ответ на это совместить ответ @Greg «s и https://docs.djangoproject.com/en/dev/ref/models/fields/#default оберточной лямбды в вызываемом.

+0

Этот ответ был опубликован до того, как @Greg изменил его ответ, поэтому он относится к лямбда. Первоначальный ответ Грега использовал лямбда .. который, если вы завернете его в вызываемый, он работает ... поэтому я не понимаю, почему голосующий голос ... – pebox11