2017-02-10 3 views
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) 

ответ

2
return User.objects.filter(userprofile__in=profiles) 
+0

Просто интересно, если бы мы имели N UserProfiles и M пользователей будет ли это быть O (M * N) операции или же Джанго как-то знать, чтобы оптимизировать его в O (N) операции? – meritus

+0

этот оператор будет переведен в один оператор sql, который выглядит так: 'select * от пользователей, где id (выберите user_id из профилей, где .....)' , поэтому сложность не увеличивается и остается близкой к O (N) или, возможно, O (N * 2)? Я не эксперт, но, конечно, не O (M * N) – Ramast

+0

С другой стороны, сложность может быть выше (на уровне DB). чтобы узнать точную сложность, вам нужно понять, как движок db выполняет подзапрос и как он использует индексы столбцов. все выходит за рамки моих знаний – Ramast