2012-07-29 18 views
0

這裏是一個玩具的例子來說明這個問題:設置屬性時模型具有通用外鍵失敗

# 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.5clean()中成功設置了屬性值。但是,在上面的示例中,直到save()纔會保留屬性值。我不知道可能會導致這種行爲。難道我做錯了什麼?這個問題似乎涉及到使用內聯接口在admin:

編輯(使用Django 1.4使用SQLite後端測試)。兩個模型的創建對象單獨工作正常。試圖在同一個管理頁面上創建兩種類型的對象(使用表格內聯接口)會導致上面的IntegrityError。

編輯2:如果我將MyModel中的通用外鍵更改爲普通models.ForeignKey(MyRelatedModel),則代碼正常工作。所以這個問題與使用通用外鍵有關。在這個階段,這看起來像是Django中的一個bug。

回答

0

您是否嘗試將null=True添加到more_data字段?我懷疑管理員首先保存父模型,因此在命中clean()方法之前驗證整個表單。

祝你好運!

+0

將'null = True'添加到'more_data'解決了IntegrityError,但保存在數據庫中的值是NULL,而不是我所期望的那樣。 – 2012-07-31 03:40:03

相關問題