Ich habe folgende Modelle:Optimierung der Datenbankabfragen in Django REST Rahmen
class User(models.Model):
name = models.Charfield()
email = models.EmailField()
class Friendship(models.Model):
from_friend = models.ForeignKey(User)
to_friend = models.ForeignKey(User)
Und diese Modelle sind in der folgenden Ansicht und Serializer verwendet:
class GetAllUsers(generics.ListAPIView):
authentication_classes = (SessionAuthentication, TokenAuthentication)
permission_classes = (permissions.IsAuthenticated,)
serializer_class = GetAllUsersSerializer
model = User
def get_queryset(self):
return User.objects.all()
class GetAllUsersSerializer(serializers.ModelSerializer):
is_friend_already = serializers.SerializerMethodField('get_is_friend_already')
class Meta:
model = User
fields = ('id', 'name', 'email', 'is_friend_already',)
def get_is_friend_already(self, obj):
request = self.context.get('request', None)
if request.user != obj and Friendship.objects.filter(from_friend = user):
return True
else:
return False
Also im Grunde für jeden Benutzer zurückgegeben von der GetAllUsers
Ansicht, ich möchte ausdrucken, ob der Benutzer ein Freund mit dem Anforderer ist (eigentlich sollte ich sowohl from_ und to_friend überprüfen, ist aber nicht wichtig für die Frage in Punkt)
Was ich sehe, ist, dass für N Benutzer in der Datenbank gibt es 1 Abfrage alle N Benutzer für immer, und dann 1 × N-Abfragen in dem Serializer des get_is_friend_already
Gibt es eine Möglichkeit, dies im Rest-Rahmen Art und Weise zu vermeiden ? Vielleicht etwas wie eine select_related
enthalten Abfrage an den Serializer übergeben, der die relevanten Friendship
Reihen hat?
+1 Große Antwort Kevin! – Fiver
Große Antwort Kevin. Danke vielmals. Die einzige kleine Verbesserung ist, dass anstelle von Freund in obj.friends, ich musste anrufen: für einen Freund in obj.friends.all() .. der entsprechende Thread ist hier: http://StackOverflow.com/Questions/6314841/ typeerror-relatedmanager-object-is-not-iterable – dowjones123
Der erste Ansatz mit "prefetch_related" wäre umständlich, wenn der Benutzer Tausende von Freunden hätte. In diesem Fall wäre es besser, nur n Abfragen für jeden Benutzer – xleon