注文は複数の注文に分割できるため、自動インクリメントの主キーと外部キーを備えたWebショップアプリケーションの注文のモデルがありますが、元の注文との関係を維持する必要があります。
class Order(models.Model):
ordernumber = models.AutoField(primary_key=True)
parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
# .. other fields not relevant here
管理サイトのOrderAdminクラスを登録しました。詳細ビューについてはparent_order
、fieldsets
属性に含めました。もちろん、デフォルトでは、これは選択ボックスにすべての注文をリストしますが、これは望ましい動作ではありません。代わりに、親注文がない(つまり、別の注文から分割されていない、parent_order
NULL /なし)注文の場合、注文は表示されません。分割された注文の場合、これは単一の親注文のみを表示する必要があります。
かなり新しいModelAdminメソッドが利用可能です。これは、クエリセットformfield_for_foreignkey
を内部でフィルタリングできるため、これに最適のようです。注文番号11208から分割された注文番号11234の詳細ビューを見ていると想像してください。コードは以下のとおりです
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'parent_order':
# kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
return db_field.formfield(**kwargs)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
コメント付きの行は、Pythonシェルで実行すると機能し、#11234の注文#11208と、そこから分割された可能性のある他のすべての注文を含む単一アイテムのクエリセットを返します。
もちろん、そこで注文番号をハードコーディングすることはできません。ordernumber
詳細ページを表示している注文インスタンスのフィールドへの参照が必要です。このような:
kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
置き換えるための有効な方法が見つかりませんか????? 「現在の」Orderインスタンスを参照して、かなり深く掘り下げました。self
内部formfield_for_foreignkey
はModelAdminインスタンスを参照し、model
属性はありますが、注文モデルインスタンスではありません(ModelBase参照です。self.model()はインスタンスを返しますが、注文番号はNoneです)。
1つの解決策は、request.path(/ admin /orders / order / 11234 /)から注文番号を取得することかもしれませんが、それは本当に醜いです。もっと良い方法があると本当にいいのですが。