のリストを持つCustomerForm
フォームセットを含む Django がありますMeter
。顧客はメーターを持っており、メーターは顧客所有の施設にあります。このフォームにより、ユーザーは顧客の施設の 1 つにメーターを割り当てることができます。
Meter
モデルには次のフィールドがあります。
facility = models.ForeignKey(
Facility,
blank=True,
null=True,
default=None,
related_name='meters',
)
フォームセットは次の方法で生成されます。
meters_formset_class = inlineformset_factory(
Customer,
Meter,
extra=0,
form=MeterInlineForm
)
次の「MeterInlineForm」定義を使用します。
class MeterInlineForm(forms.ModelForm):
class Meta:
fields = (
'facility',
)
model = Meter
def __init__(self, *args, **kwargs):
super(MeterInlineForm, self).__init__(*args, **kwargs)
meter = kwargs.get('instance', None)
if meter != None:
if meter.customer != None:
self.fields['facility'].queryset = \
meter.customer.facilities.order_by('name')
これはうまく機能します-数百メートルの顧客がいるまでは。次に、Django docs に記載されているように、 A ModelChoiceField
:
外部キーを表すのに適した単一のモデル オブジェクトを選択できます。エントリ数が増えると、ModelChoiceField のデフォルト ウィジェットは実用的でなくなることに注意してください。100 を超えるアイテムには使用しないでください。
質問: このパフォーマンスの問題を解決するにはどうすればよいですか?
Update : これは、大規模な UpdateViews を一般的に処理する方法に要約されます。DetailView については、AJAXy マジックを使用して、ユーザーに表示されるレコードのデータのみを取得します。ユーザーがレコード 1 とレコード 300 を更新する可能性があるため、これは UpdateViews では機能しません。これらはおそらく同時に表示されません。
更新: メーター フォームセット テーブルの一部の例を次に示します。
更新: 問題に対する別のユーザーのアプローチ:一度に複数の関連レコードを編集するための Django Inline formset - 正しい方法?