Django ドキュメントでForeignKey.limit_choices_toに出会いました。これがどのように機能するかはまだわかりませんが、ここでは正しいかもしれません。
更新: ForeignKey.limit_choices_to を使用すると、定数、呼び出し可能オブジェクト、または Q オブジェクトのいずれかを指定して、キーの許容可能な選択肢を制限できます。関連するオブジェクトについて何も知らないので、定数はここでは明らかに役に立ちません。
呼び出し可能 (関数またはクラス メソッド、または任意の呼び出し可能オブジェクト) を使用すると、より有望に思えます。ただし、HttpRequest オブジェクトから必要な情報にどのようにアクセスするかという問題が残ります。スレッド ローカル ストレージを使用することが解決策になる場合があります。
2.更新:これが私のために働いたものです:
上記のリンクで説明されているように、ミドルウェアを作成しました。「product=1」など、リクエストの GET 部分から 1 つ以上の引数を抽出し、この情報をスレッド ローカルに格納します。
次に、スレッド ローカル変数を読み取り、外部キー フィールドの選択を制限するための ID のリストを返すモデル内のクラス メソッドがあります。
@classmethod
def _product_list(cls):
"""
return a list containing the one product_id contained in the request URL,
or a query containing all valid product_ids if not id present in URL
used to limit the choice of foreign key object to those related to the current product
"""
id = threadlocals.get_current_product()
if id is not None:
return [id]
else:
return Product.objects.all().values('pk').query
通常の管理ページが正常に機能するように、何も選択されていない場合は、可能なすべての ID を含むクエリを返すことが重要です。
次に、外部キー フィールドを次のように宣言します。
product = models.ForeignKey(
Product,
limit_choices_to={
id__in=BaseModel._product_list,
},
)
問題は、リクエストを介して選択肢を制限するための情報を提供する必要があることです。ここで「自己」にアクセスする方法がわかりません。