атрибут поля модели по умолчанию в Django - PullRequest
0 голосов
/ 13 января 2011

У меня есть модель Django:

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

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

По какой-то причине getdefault() никогда не вызывается, даже когда я создаю экземпляры этой модели и сохраняю их в базе данных. Кажется, это противоречит документации Django :

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 Ответ

1 голос
/ 13 января 2011

Удалите статический метод-декоратор, и он будет работать:

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()), когда модель определена.

Надеюсь, что это может помочь:)

...