2016-06-30 13 views
0

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?

+0

Ein bisschen unklar: Gibt es FK von "Position" zu "Symbol" oder umgekehrt? – zymud

+0

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

+0

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) –

Antwort

1

Ich denke, Sie sollten in prefetch_related alle Felder des Modells positionieren, die eine Verbindung zu einem anderen Modell haben, in Ihren Fällen müssen Sie Feld Benutzer hinzufügen: PositionFormSet(queryset=user.position_set.all().prefetch_related('symbol', 'user')).


P.S. es hat für mich funktioniert.

Verwandte Themen