3

モデルで次のように定義しています。

class TaskLink(models.Model):
    task = model.ForeignKey(Task)
    link_choices = (
        models.Q(app_label="accounts", model="location"),
        # Other models are also linked to here.
    )
    linked_content_type = \
        models.ForeignKey(
            ContentType,
            limit_choices_to=link_choices
        )
    linked_object_id = models.PositiveIntegerField()
    linked_object = \
        generic.GenericForeignKey(
            'linked_object_content_type',
            'linked_object_id'
        )

このモデルは、タプルTask内のモデルのいずれかとオブジェクトをリンクします。link_choicesこの場合、accounts.Locationモデルはこのリストにあります。

私の問題は、Locationオブジェクトを削除すると、関連するオブジェクトがカスケード削除される場合に発生しTaskLinkます。削除に失敗し、次のエラー メッセージが表示されます。

django.core.exceptions.FieldError: Cannot resolve keyword 'object_id' into field. Choices are: id, linked_object, linked_object_content_type, linked_object_content_type_id, linked_object_id, task, task_id

ビューは、パラメーターとモデル セット (およびディスパッチ メソッドにパーミッション デコレーターが追加されている)django.views.generic.DeleteViewのみを持つのインスタンスです。モデルをミックスpk_url_kwargに追加する前は、linked_object_fine で動作していました。TaskLink

私は何が欠けていますか?

編集: これは Django のバグのようです。一般的な外部キーを介してオブジェクトをカスケード削除する場合、Django は、フィールドのコンストラクターに渡すフィールド名文字列を無視し、GenericForeignKey代わりにcontent_typeandフィールドを探しobject_idますが、私の場合は存在しませんでした。これにより、カスケード削除を実行しない限り、モデルが持つ可能性のある一般的な外部キーの数が効果的に 1 に制限されます。

この問題は意図的な動作である可能性があるため、Django メーリング リストを通じて送信しました。

4

1 に答える 1