2012-01-27 4 views
0

Я переопределяю метод save_model моего ModelAdmin, поэтому я могу установить дополнительные поля в модели. Тем не менее, я продолжаю получать исключение DoNotExist. Я прошел через код с помощью отладчика, и я немного смущен.Почему объект, переданный ModelAdmin.save_model, не соответствует модели?

Модель имеет это поле:

created_by = models.ForeignKey(User, db_column='created_by', related_name='%(class)s_creator') 

В методе save_model, когда я смотрю на атрибуты параметра obj, я вижу это:

Name: 
created_by 

Value: 
str: Traceback (most recent call last): 
    File "/home/vicki/.eclipse/org.eclipse.platform_3.7.0_155965261/plugins/org.python.pydev.debug_2.3.0.2011121518/pysrc/pydevd_resolver.py", line 182, in _getPyDictionary 
    attr = getattr(var, n) 
    File "/usr/lib/pymodules/python2.7/django/db/models/fields/related.py", line 301, in __get__ 
    raise self.field.rel.to.DoesNotExist 
DoesNotExist 

Name: 
created_by_id 

Value: 
NoneType: None 

Где «created_by_id» пришел из , и почему «created_by» не существует?

ответ

0

Есть ли особая причина, почему вы использовали db_column='created_by'? Вы имеете дело с устаревшей базой данных? Обычно вы позволяете Django обрабатывать имя столбца db. По умолчанию Django добавит _id к имени поля для создания имени столбца db. Это объясняется в документах Django Foreign Key.

На вашем экземпляре модели вы можете получить доступ к:

`obj.created_by_id` # the primary key of the related User instance 
`obj.created_by` # The `User` instance 

Вы не можете получить доступ к obj.created_by в методе, потому что вы не назначили пользователю еще. Значение created_by_id равно None, и попытка получить User с первичным ключом None естественно вызывает исключение DoesNotExist.

Ваш метод save_model должен выглядеть примерно так:

class MyModelAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     obj.created_by = request.user 
     obj.save() 
+0

Нет особых причин для 'db_column = 'created_by'', я просто предпочитаю это. Возможно, я должен позволить Django справиться с этим. Информация в вопросе - это то, что 'obj' выглядит в самом начале метода save_model, прежде чем я что-то ему сделал. Я хочу присвоить поле 'created_by' модели' request.user'. – Pikaling

+0

Вы не можете получить доступ к 'obj.created_by' до тех пор, пока ему не будет присвоено значение. Я обновил свой ответ с предложением о том, как должен выглядеть ваш метод 'save_model'. Я рекомендую вам не использовать 'db_column', но вы можете использовать его здесь, если хотите. – Alasdair

+1

А теперь это имеет смысл - я хотел проверить, было ли это уже назначено, прежде чем я его назначил. Я изменил свой код, поэтому он проверяет 'created_by_id', и если его нет, он назначает' created_by'. Спасибо за вашу помощь. – Pikaling