2011-01-13 3 views
0

У меня есть модель Django:по умолчанию атрибут модели поля в Django

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

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

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

Field.default

Значение по умолчанию для поля. Это может быть значение или вызываемый объект. Если вызывается, он будет вызываться каждый раз, когда создается новый объект .

Я делаю что-то неправильно?

Update:

Изначально я был, но потом я перешел на выше версии для отладки:

_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

Снимите STATICMETHOD декоратор, и он будет работать:

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

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

Edit: Из вашего обновления я думаю, что самый простой способ в данном случае это просто сделать:

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

И почему ваш первый пример не работал, потому что cPickle.dumps(set()) si не вызываемый вы оцениваете cPickle.dumps(set()), когда модель определена.

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

+0

, что дает ошибку, что 'MyModel не defined' –

+0

@Rosarch: Вы должны поставить имя вашей модели, я назвал __MyModel__ просто как пример :) – mouad

+0

@Rosarch : я только что отредактировал мой ответ, извините за это, теперь я тестировал и это работает, надеюсь, что это может помочь :) – mouad

Смежные вопросы