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 admin でオブジェクトを作成しようとすると、次のエラーが発生します。

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 を使用してテスト済み)

編集:この問題は、管理者でインライン インターフェイスを使用することに関連しているようです。2 つのモデルのオブジェクトを別々に作成すると、うまくいきます。(表形式のインライン インターフェイスを使用して) 同じ管理ページに両方のタイプのオブジェクトを作成しようとすると、上記の IntegrityError が発生します。

Edit2: MyModelの一般的な外部キーをプレーンに変更するmodels.ForeignKey(MyRelatedModel)と、コードは正常に機能します。したがって、問題は一般的な外部キーの使用に関連しています。この段階では、これは Django のバグのようです。

4

1 に答える 1

0

null=Truemore_data フィールドに追加しようとしましたか? 管理者は最初に親モデルを保存するため、フォーム全体を検証してから clean() メソッドを実行すると思われます。

幸運を!

于 2012-07-30T05:46:45.323 に答える