モデルで次のように定義しています。
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_type
andフィールドを探しobject_id
ますが、私の場合は存在しませんでした。これにより、カスケード削除を実行しない限り、モデルが持つ可能性のある一般的な外部キーの数が効果的に 1 に制限されます。
この問題は意図的な動作である可能性があるため、Django メーリング リストを通じて送信しました。