2017-09-01 1 views
0

Meine Modelle:Django prefetch_related auf __str __() -Methode

class B(models.Model): 
    label = models.CharField() 

class A(models.Model): 
    b = models.OneToOneField(B, null=True, blank=True, on_delete=models.PROTECT) 

    def __str__(self): 
     return u'[{}] Event:'.format(self.b.label) 

Nun sucht Anfragen während einer Anfrage mit django-Debug-Toolbar getan, ich festgestellt, dass viele Abfragen ausgeführt werden, mehr als 200-mal. Ich verstehe, dass ich mit prefetch_related lösen werde, aber wo muss ich es setzen, wenn das Nachschlagen innerhalb der str-Methode erfolgt?

+1

Nein! Gib es nicht in "__str__". Bitte posten Sie Ihre Ansicht Code, das ist wahrscheinlich wo alle diese Fragen passieren –

+0

Die 200 + Zeiten werden durch Auswahl in Form der browsbaren API verursacht – user1518217

+0

gut, ich glaube nicht, dass das anpassbar ist. Und es ist in Ordnung, solange Ihre Endbenutzer diese Seite nicht sehen. Sie sollten Ihre eigenen Ansichten optimieren –

Antwort

1

Ihr GenericView oder ModelViewSet sollte ein queryset Attribut haben, das definiert, an welcher Einstellung es funktionieren soll.

Sie müssen die prefetch_related/select_related dort hinzufügen.

class UserList(generics.ListCreateAPIView): 
    queryset = User.objects.all().prefetch_related('groups') 
    serializer_class = UserSerializer 
    permission_classes = (IsAdminUser,) 
+0

ist alles() notwendig? – user1518217

Verwandte Themen