2017-02-10 28 views
2

私は検索しましたが、私のような状況は見つかりませんでした。 DjangoのUser Profileメソッドを使用してデフォルトのユーザ機能を拡張すると仮定すると、マルチオブジェクトクエリセットはどのように関連オブジェクトのクエリセットにマッピングされますか?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はサイズ1である場合にのみ機能します。

return User.objects.filter(userprofile=profiles) 

答えて

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

興味があるだけ我々はN USERPROFILESとMのユーザーを持っていた場合、これはO(M * N)操作になりますか、Djangoは何らかの形でO(N)操作にそれを最適化するために、知っているのですか? – meritus

+0

このステートメントは、次のような単一のSQL文に変換されます 'select * from users where(select user_id from profiles .....) ' 複雑さが増えず、 O(N)またはおそらくO(N * 2)?私は専門家ではありませんが、確かにO(M * N)ではありません – Ramast

+0

2番目の考えでは、複雑さがより高くなる可能性があります(DBレベル)。 dbエンジンがサブクエリをどのように実行するのか、カラムインデックスをどのように利用するのかを理解するために必要な正確な複雑さを知る必要があります。すべて私の知識の範囲外です – Ramast

関連する問題