/ / Django formset_factory und Fremdschlüsseleffizienz - Django, Leistung, Formset

Django formset_factory und Fremdschlüsseleffizienz - Django, Leistung, Formset

Ich verwende Djangos eingebaute Form.ModelForm und formset_factory, um Formulare für Benutzereingaben bereitzustellen. Einige der Felder im Formular sind Auswahlfelder, und die Daten in diesen Feldern bestehen aus mehreren Feldern. Ich erwarte also mehrere DB-Treffer pro Auswahl. Wenn ich jedoch zusätzliche Formulare (z. B. durch Verwendung des Parameters "extra") für jedes zusätzliche Formular hinzufüge, stößt es erneut in die Datenbank. Wenn zum Beispiel 4 DB-Treffer für eine Auswahl bestehen und bei 10 Auswahlmöglichkeiten, erwarten wir 40 Abfragen. Wenn ich jedoch 5 "zusätzliche" Inlines hinzufüge, stehen plötzlich 4 * 10 * 5 für 200 Abfragen zur Verfügung. Ist formset_factory nicht bewusst, dass die Auswahlbox für alle Inlines gleich ist? Warum so viele Datenbankzugriffe? Gibt es eine bessere Möglichkeit, dies zu tun? Meiner Meinung nach sollten die Auswahlmöglichkeiten einmal generiert und für jede Auswahlbox verwendet werden (dh , 40 Abfragen für dieses bestimmte Beispiel).

Antworten:

1 für die Antwort № 1

Ich würde definitiv zustimmen, dass die Formularsätze intelligent genug sein sollten, um sie nicht so oft abzufragen. Ich bin schon oft darauf gestoßen. Am Ende habe ich etwas getan:

class TestFormset(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(TestFormset,self).__init__(*args, **kwargs)

awesome_models = AwesomeModel.objects.all()

for form in self.forms:
form.fields["awesome_model"].choices = [("", "--------")] + [(x.pk, x.name) for x in awesome_models]

Dabei wird im Grunde nur eine Abfrage ausgeführt, und dann wird das Feld für jedes Formular im Formularsatz manuell festgelegt.