2016-05-12 10 views
0

iOSプロジェクトのバックエンドAPIとして機能するDjango RESTアプリケーションを構築しました。私のオブジェクトモデルでは、 'Subscription'を使用して 'User'オブジェクトと 'Workspace'オブジェクトを結合します。ここでは簡略化され、私のmodels.pyの一部です:クエリーセットと間接的な関係をシリアル化するにはどうすればよいですか?

class User(models.Model): 
    # some property fields 

class Workspace(models.Model): 
    # some property fields 

class Subscription(models.Model): 
    # some property fields 
    user = models.ForeignKey(
     User, 
     on_delete=models.CASCADE, 
     related_name='subscriptions') 
    workspace = models.ForeignKey(
     Workspace, 
     on_delete=models.CASCADE, 
     related_name='subscriptions') 

私はiOSのフロントエンドからのHTTP GETでワークスペース・オブジェクトのリストを取得することができますので、私は、オブジェクトのクラスベースのビューを構築しています。便宜上、ワークスペースのリストにモデルフィールド以外のものを追加したいと思います。たとえば、すべてのワークスペースオブジェクトに対して購読しているユーザーのリストを含める必要があります。フィールドをシリアル化するためにSerializerMethodField()とクエリーセットを使用することをお勧めしましたが、クエリの構築方法はわかりません。彼らは直接関連しているので

class WorkspaceSerializer(serializers.ModelSerializer): 
    subscribed_users = serializers.SerializerMethodField() 

    class Meta: 
     model = Workspace 
     fields = ('id', 'subscribed_users') 

    def get_users(self, workspace): 
     users = User.objects.filter(???) 
     serializer = UserSerializer(instance=users, many=True) 
     return serializer.data 

ワークスペースに関連するサブスクリプションを取得するには簡単ですが、どのように私は疑問にワークスペースに加入しているユーザーを得るのです:私はここまで持っていますか?

答えて

2

私が探していた構文は、DRFでspanningという二重のアンダースコアでした。例:

def get_users(self, workspace): 
    users = User.objects.filter(subscription_set__workspace=workspace) 
    serializer = UserSerializer(instance=users, many=True) 
    return serializer.data 
関連する問題