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)