1

のリストを持つ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 - 正しい方法?

4

0 に答える 0