2016-11-30 1 views
1

Ich habe ein Product Model, Fremdschlüssel zum Firmenmodell, onetoone Schlüssel für Benutzer.Django: UpdateView - Versand: reduzieren Sie die Anzahl der Abfragen

Ich überschreibe die Dispatch (Methode), um zu überprüfen, ob der Benutzer berechtigt ist, das Objekt (Produkt) zu bearbeiten.

Ich versuche, die Abfragen an die Datenbank zu optimieren, weil einige von ihnen Duplikate sind.

def dispatch(self, request, *args, **kwargs): 
    obj = self.get_object() 
    if obj.company.user != request.user: 
     raise PermissionDenied 
    else: 
     print('ok') 
     return super().dispatch(request, *args, *kwargs) 

Abfrage Produkte

obj = self.get_object() 

Abfrage Unternehmen und Abfrage Benutzer zweimal

if obj.company.user != request.user: 

Abfrage Produkte wieder

return super().dispatch(request, *args, *kwargs) 

Wie kann ich optimieren und entfernen dupliziert Fragen?

Antwort

3

Sie können eine der Benutzerabfragen verhindern, indem Sie IDs anstelle von Modellinstanzen vergleichen.

Die Anzahl der Abfragen zu reduzieren, ist schwieriger. In der Praxis hat das Entfernen der doppelten Abfragen keinen merklichen Effekt, und es ist wahrscheinlich nicht Wert, Ihren Code zu komplizieren.

Um die doppelte Objektsuche zu verhindern, können Sie das Objekt als self.object zwischenspeichern.

def dispatch(self, request, *args, **kwargs): 
    self.obj = self.get_object() 
     if obj.company.user != request.user: 
     raise PermissionDenied 

außer Kraft setzen Dann dann get_object zuerst den Cache zu überprüfen.

def get_object(self, queryset=None): 
    obj = getattr(self, 'object', None) 
    if obj is None: 
     obj = super().get_object(queryset) 
    return obj 

Sie wahrscheinlich select_related() der Firma Abfrage befreien, indem Sie bekommen können, wenn das Objekt abgerufen werden. Auch dies wird den Code komplizierter machen und ist wahrscheinlich nicht wert.

Verwandte Themen