In meiner Django-Anwendung habe ich Benutzer, die mehrere Positionen haben können. zB: Das Positionsmodell hat einen Fremdschlüssel für das Benutzermodell. ein django modelformset_factory
I-Ausgang, alle für den aktuell angemeldeten zugehörigen Positionen in Benutzer mithilfe wie folgt:Doppelte Abfrage für jedes Formular im Formularsatz
Views.py:
class ABCUpdate(View):
def get(self, request):
user = request.user
PositionFormSet = modelformset_factory(Position)
formset = PositionFormSet(queryset=user.position_set.all().prefetch_related('symbol'))
return render(request,
'some_template.html',
{'formset': formset})
some_template.html
<form action="#" method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for position in formset %}
<div class="row">
{{ position }}
</div>
{% endfor %}
<button type="submit">
Update
</button>
</form>
Position Modell:
Eines der Felder auf some_template.html
ist die symbol
Feld (dh: das, für das ich prefetch_related
in den obigen Schnipsel verwende). Symbol
stammt von einem anderen Modell, das einen Fremdschlüssel verwendet. Dies bedeutet, dass in der HTML-Vorlage das Feld symbol
ein Dropdown-Feld ist, in dem der Benutzer das gewünschte Symbol auswählen kann.
Das alles funktioniert ordnungsgemäß, jedoch ist das Problem, dass die Datenbank für jedes einzelne Formular im Formularsatz abgefragt wird, um die Liste der symbol
's abzurufen. Wenn der Benutzer zum Beispiel 10 Positionen hat, wird für jede Position ein Dropdown-Feld für das Symbol, ... angezeigt, was zu einer separaten Datenbankabfrage führt, um alle Symbole abzurufen.
Wie gehe ich über nur eine Abfrage für alle verfügbaren symbol
's und die Verwendung für das Dropdown in jeder Form im Formularsatz?
Ein bisschen unklar: Gibt es FK von "Position" zu "Symbol" oder umgekehrt? – zymud
Ja, der Fremdschlüssel ist von Position zu Symbol. Mit anderen Worten, ein Benutzer kann mehrere Positionen haben. Dann wird für jede Position ein Symbol ausgewählt, das aus der Symboltabelle/Modell kommt. – darkpool
Mögliches Duplikat von [Django Inline Formsets und Choosefields generieren zu viele DB-Abfragen] (http://stackoverflow.com/questions/9583096/django-inline-formsets-and-choicefields-generate-too-many-db-queries) –