Django - Самый быстрый способ запросить несколько первичных ключей, чтобы создать список атрибутов модели и uuid для возврата?

Итак, у меня есть функциональность, которая должна возвращать список последователей пользователя, с uuid и именем пользователя последователя. Причина, по которой имя пользователя не является PK, заключается в том, что я использую amplify, а он возвращает UUID для идентификатора пользователя. Как вы можете видеть ниже, я просто запрашиваю всех последователей пользователя, затем делаю цикл for, чтобы получить имя пользователя каждого последователя, и создаю дикту с uuid и именем пользователя, которая попадает в список. У меня есть опасения, что это будет довольно медленно. Есть ли более быстрый способ сделать это?

Model.py

class AbstractBaseModel(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created = models.DateTimeField('Created at', auto_now_add=True)
    updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)

    class Meta:
        abstract = True
    
    def __repr__(self):
        return f'<{self.__class__.__name__} {self.uuid}>'

class User(AbstractBaseModel):
    username = models.CharField(max_length=255, unique=True)
    email = models.EmailField(max_length=255, unique=True)

class FollowUser(AbstractBaseModel):
    follower_id = models.ForeignKey(User, on_delete=models.CASCADE, related_name="follower_following")
    followee_id = models.OneToOneField(User, on_delete=models.CASCADE, related_name="followee_followed_by")

View.py

@api_view(['GET'])
def get_followers(request, followee_id):
    try:
        followers = FollowUser.objects.filter(followee_id=followee_id).values_list('follower_id', flat=True)
        followers_list = list(followers)
        data = list()
        for follower_uuid in followers_list:
            try:
                username = User.objects.get(pk=follower_uuid).username
            except User.DoesNotExist:
                return Response(dict(error=f'follower id: {follower_uuid} does not exist in User model'), status=status.HTTP_400_BAD_REQUEST)
            data.append(dict(username = username, id = follower_uuid))
        response_data = dict(followers=data)
        return JsonResponse(response_data, status=status.HTTP_200_OK)
    except FollowUser.DoesNotExist:
        return Response(dict(error=f'followee id: {followee_id} does not exist in FollowUser model'), status=status.HTTP_400_BAD_REQUEST)

Итак, похоже, что у вас уже есть UUID последователей. В таком случае, вместо того, чтобы перебирать их и выполнять запрос для каждого, вы можете действовать быстрее, выполнив in запрос и получив их всех обратно одним обращением к БД.

Так что вместо

 for follower_uuid in followers_list:
        try:
            username = User.objects.get(pk=follower_uuid).username
        except User.DoesNotExist:
            return Response(dict(error=f'follower id: {follower_uuid} does not exist in User model'), status=status.HTTP_400_BAD_REQUEST)
        data.append(dict(username = username, id = follower_uuid))

Возможно, вы можете сделать что-то вроде (возможно, вам придется немного подправить это, чтобы соответствовать вашей конкретной ситуации):

followers = User.objects.filter(pk__in=followers_list).values('username', 'pk')
data.extend(followers)
Вернуться на верх