「self」への外部キーを持つ ForeignKeyField (FKF) または ManyToManyField (MTMF) フィールドを持つモデルが与えられた場合、Django 管理者 (管理者) 内で自己(再帰) 選択を防ぐにはどうすればよいですか。
つまり、admin でモデル インスタンスの自己 (再帰的) 選択を防ぐことができるはずです。これは、新しいインスタンスを作成するのではなく、モデルの既存のインスタンスを編集するときに適用されます。
たとえば、ニュース アプリの記事の次のモデルを取り上げます。
class Article(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField()
related_articles = models.ManyToManyField('self')
3 つArticle
のインスタンス (タイトル: a1-3) がある場合Article
、管理者を介して既存のインスタンスを編集すると、related_articles
フィールドはデフォルトで、すべての記事のリストを提供する html (複数) 選択ボックスによって表されます ( Article.objects.all()
)。Article
ユーザーは、それ自体以外のインスタンスのみを表示し、選択できるようにする必要があります。たとえば、 Article
a1 を編集するときrelated_articles
に、a2、a3 を選択できます。
現在、これを行う方法には 3 つの可能性があると考えています。
- の管理フォーム フィールドで利用可能な選択肢を提供するクエリセットを設定する方法を提供します(たとえば、ユーザーが表示および選択できる related_articles のリストから編集中の現在のインスタンスを除外する
related_articles
など、除外クエリ フィルターを介して) 。使用するクエリセットは、 customArticle.objects.filter(~Q(id__iexact=self.id))
のコンストラクタ ( ) 内で発生する可能性があり、または何らかの動的オプションを介して発生する可能性があります. これには、フィルタリングに使用するために編集中のインスタンスを取得する方法が必要になります.__init__
Article ModelForm
limit_choices_to Model
- またはクラスの
save_model
関数をオーバーライドして、インスタンスを保存する前にそれ自体をチェックしてから削除します。これは、管理者ユーザーが編集中のインスタンスを含むすべての記事を表示および選択できることを意味します (既存の記事の場合)。Article Model
ModelAdmin
related_articles
- テンプレートなど、管理者以外で使用する必要がある場合は、自己参照を除外します。
理想的な解決策 (1) は、編集中のインスタンスのフィルターされたクエリセット変数をモデル フォーム コンストラクターに渡すことができるため、現在、管理者の外部のカスタム モデル フォームを介して実行できます。質問は、Article
同じことを行うためにフォームが作成される前に管理者が編集しているインスタンス、つまり 'self' を取得できるかということです。
これについて間違った方法で行っている可能性がありますが、FKF / MTMF を同じモデルに定義することが許可されている場合は、管理者に正しいことをさせ、ユーザーが自分自身を選択できないようにする方法があるはずです。利用可能な選択肢のリストから除外します。
注:解決策 2 と 3 は現在実行可能であり、これらを回答として取得しないようにするために提供されています。理想的には、解決策 1 への回答を得たいと考えています。