【问题标题】:default model field attribute in DjangoDjango中的默认模型字段属性
【发布时间】:2011-01-13 01:34:23
【问题描述】:

我有一个 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 应该如何工作。

【问题讨论】:

    标签: python django models


    【解决方案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()) si 不是可调用的,您在定义模型时正在评估 cPickle.dumps(set())

    希望对你有帮助:)

    【讨论】:

    • @Rosarch : 你必须输入你的模型的名字,我命名为 MyModel 只是作为一个例子:)
    • @Rosarch:我刚刚编辑了我的答案很抱歉,现在我已经测试并且它工作了,希望它可以帮助:)
    • @Rosarch:我刚刚像你一样运行了测试,我没有收到任何错误!!!我不知道为什么你会在那里遇到错误,但我可以告诉你,在我的情况下,测试没有失败,所以你必须检查别的东西,希望你能找到答案:)
    猜你喜欢
    • 2012-08-20
    • 2021-11-29
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2012-08-09
    • 2011-02-16
    相关资源
    最近更新 更多