我已经构建了一个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
获取与工作空间相关的订阅很容易,因为它们直接相关,但如何让订阅相关工作空间的用户获得?
答案 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