如何序列化与查询集的间接关系?

时间:2016-05-12 20:15:05

标签: django-rest-framework

我已经构建了一个Django REST应用程序作为后端API用于iOS项目。在我的对象模型中,我使用“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

获取与工作空间相关的订阅很容易,因为它们直接相关,但如何让订阅相关工作空间的用户获得?

1 个答案:

答案 0 :(得分: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
相关问题