这是一个玩具示例来说明问题:
# models.py
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
class MyRelatedModel(models.Model):
some_field = models.IntegerField()
some_models = generic.GenericRelation('MyModel')
class MyModel(models.Model):
data = models.TextField()
more_data = models.FloatField(editable=False)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
def clean(self):
super(MyModel, self).clean()
self.more_data = 5.5
def save(self, *args, **options):
print self.more_data # prints 'None'
super(MyModel, self).save(*args, **options)
admin.py 中有以下内容:
from django.contrib import admin
from django.contrib.contenttypes import generic
from test_model_save.models import MyModel, MyRelatedModel
class MyModelInline(generic.GenericTabularInline):
model = MyModel
class MyRelatedModelAdmin(admin.ModelAdmin):
inlines = [MyModelInline]
admin.site.register(MyModel)
admin.site.register(MyRelatedModel, MyRelatedModelAdmin)
当我尝试在 Django 管理员中创建对象时,出现以下错误:
IntegrityError at /admin/test_model_save/myrelatedmodel/add/
test_model_save_mymodel.more_data may not be NULL
在将通用外键添加到 MyModel 之前,成功设置属性值的self.more_data = 5.5
行clean()
。但是,在上面的示例中,属性值直到save()
. 我不知道是什么导致了这种行为。难道我做错了什么?
(使用带有 Sqlite 后端的 Django 1.4 进行测试)
编辑:问题似乎与在管理员中使用内联界面有关。分别创建两个模型的对象可以正常工作。尝试在同一个管理页面上创建两种类型的对象(使用表格内联界面)会导致上面的 IntegrityError。
Edit2:如果我将 MyModel 中的通用外键更改为 plain models.ForeignKey(MyRelatedModel)
,则代码可以正常工作。所以问题与使用通用外键有关。在这个阶段,这看起来像是 Django 中的一个错误。