2
Я искал вокруг, но не нашел такую ситуацию, как моя. Предполагая использование метода профиля пользователя Django для расширения пользовательских функций по умолчанию, каким образом запрос на множественные объекты будет сопоставлен с запросом связанного объекта.Django QuerySet выбрать связанные объекты
Например (в моделях):
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
friends = models.ManyToManyField("self", symmetrical=True, blank=True)
И внутри вида:
class Friends(generics.ListAPIView):
queryset=User.objects.all()
serializer_class = UserSerializer
def get_queryset(self):
user = self.request.user
profile = user.userprofile
profiles = profile.friends.all()
return profiles #We want this to be a queryset of users
Я попытался следующие, но это работает только если profiles
имеет размер один.
return User.objects.filter(userprofile=profiles)
Просто интересно, если бы мы имели N UserProfiles и M пользователей будет ли это быть O (M * N) операции или же Джанго как-то знать, чтобы оптимизировать его в O (N) операции? – meritus
этот оператор будет переведен в один оператор sql, который выглядит так: 'select * от пользователей, где id (выберите user_id из профилей, где .....)' , поэтому сложность не увеличивается и остается близкой к O (N) или, возможно, O (N * 2)? Я не эксперт, но, конечно, не O (M * N) – Ramast
С другой стороны, сложность может быть выше (на уровне DB). чтобы узнать точную сложность, вам нужно понять, как движок db выполняет подзапрос и как он использует индексы столбцов. все выходит за рамки моих знаний – Ramast