可调用的Django模型属性值评估

时间:2015-06-24 21:28:58

标签: python django django-models

为什么在upload模型的这两个属性中,time每次都会被评估 我添加了一个新实例,但string根本没有变化? (inUnixTime为我提供了unix时间内的当前日期时间)

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。如果我只使用callable,那么

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

然后我得到对象的内存地址而不是字符串的unix时间。

提前谢谢!

2 个答案:

答案 0 :(得分:3)

str(inUnixTime())返回一个字符串,就像u'A string'一样 - 它不是可调用的,因此它不会发生变化。当您使用inUnixTime函数作为默认函数时,它是可调用的,因此每次都会调用它。

你可能想要的是:

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

然后:

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

答案 1 :(得分:-1)

答案是将@Greg的答案和https://docs.djangoproject.com/en/dev/ref/models/fields/#default包裹在一个可调用的lambda中。