У меня есть следующие модели:
class User(models.Model):
name = models.Charfield()
email = models.EmailField()
class Friendship(models.Model):
from_friend = models.ForeignKey(User)
to_friend = models.ForeignKey(User)
И эти модели используются в следующем представлении и сериализаторе:
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
Итак, в основном, для каждого пользователя, возвращенного представлением GetAllUsers
, я хочу распечатать, является ли пользователь другом запрашивающего (на самом деле я должен проверить и from_, и to_friend, но это не имеет значения для рассматриваемого вопроса)
Я вижу, что для N пользователей в базе данных есть 1 запрос для получения всех N пользователей, а затем 1xN запросов в get_is_friend_already
сериализатора
Есть ли способ избежать этого с помощью остальной части фреймворка? Может быть, что-то вроде передачи select_related
включенного запроса в сериализатор с соответствующими Friendship
строками?