为什么传递给ModelAdmin.save_model的对象与Model不匹配?

时间:2012-01-27 23:29:33

标签: django django-models

我重写了ModelAdmin的save_model方法,因此我可以在模型上设置一些额外的字段。但是,我一直得到一个DoesNotExist异常。我用调试器逐步完成了代码,我有点困惑。

模型有这个字段:

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'不存在?

1 个答案:

答案 0 :(得分: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()