我有一个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
应该如何运作。
答案 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())
的可调用者。
希望它可以提供帮助:)