Django中的默认模型字段属性

时间:2011-01-13 01:34:24

标签: python django models

我有一个Django模型:

    @staticmethod
    def getdefault():
        print "getdefault called"
        return cPickle.dumps(set())

    _applies_to = models.TextField(db_index=True, default=getdefault)

由于某种原因,即使我构造此模型的实例并将其保存到数据库,也永远不会调用getdefault()。这似乎与Django documentation

相矛盾
  

Field.default

     

默认值   场。这可以是一个值或一个   可调用的对象。如果可以调用它   每当一个新对象被调用时   创建

我做错了吗?

更新

最初,我有这个,但后来我切换到上面的版本进行调试:

_applies_to = models.TextField(db_index=True, default=cPickle.dumps(set()))

我不确定为什么那不起作用。

更新2 :我仍然遇到此问题。这是我的模特:

class Threshold(models.Model):
    # ...
    _applies_to = models.TextField(db_index=True, default=lambda: cPickle.dumps(set()))

测试:

def setUp(self):
    self.threshold = Threshold() 

    self.threshold.save()

def test_default_applies_to(self):
    self.assertEqual(self.threshold._applies_to, cPickle.dumps(set()))  

此测试失败。我不确定为什么。

FAIL: test_default_applies_to (apps.threshold.tests.ThresholdTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 27, in test_default_applies_to
    self.assertEqual(self.threshold._applies_to, cPickle.dumps(set()))
AssertionError: 'N.' != 'c__builtin__\nset\np1\n((ltRp2\n.'

为什么会发生这种情况?也许我不明白default应该如何运作。

1 个答案:

答案 0 :(得分:1)

删除staticmethod装饰器,它将起作用:

def getdefault():
    print "getdefault called"
    return cPickle.dumps(set())

_applies_to = models.TextField(db_index=True, default=getdefault)

修改:从您的更新中我认为在这种情况下最简单的方法就是:

models.TextField(db_index=True, default=lambda: cPickle.dumps(set()) 

为什么你的第一个例子不起作用,这是因为cPickle.dumps(set())不是你在定义模型时评估cPickle.dumps(set())的可调用者。

希望它可以提供帮助:)