2016-05-12 28 views
0

我已經構建了一個Django REST應用程序作爲iOS項目的後端API。在我的對象模型中,我使用'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()和querysets來序列化字段,但我不知道如何構建查詢。我走了這麼遠:

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