使用Django REST进行动态序列化

时间:2015-04-07 00:22:55

标签: django serialization django-rest-framework

我有Person模型和Address模型。一个person可以有多个地址,因此Address模型如下所示:

Address(models.Model):
    person = models.ForeignKey(Person, related_name="addresses")
    ...

我想序列化一个person实例,我做了最简单的事情:

PersonSerializer(serializers.ModelSerializer):
    class Meta:
        fields = (..., "addresses", ...)

但是,假设我想根据当前addresses序列化request.user,以便不同的当前user查看不同的地址集,我该如何修改代码吗

2 个答案:

答案 0 :(得分:0)

我假设你想要一个像/ user / current /这样的静态端点,它为你提供了当前请求用户的Person对象+相关的地址记录。添加如下视图:

class CurrentUser(GenericAPIView):
    model = Person
    serializer_class = PersonSerializer
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request):
        return Response(self.get_serializer(request.user).data)

只有在用户不是匿名用户并且将使用您的PersonSerializer转储请求用户时才能访问它。如果您相应地设置“地址”序列化器字段,则会按照您的意愿出现相关的地址记录,如下所述:

http://www.django-rest-framework.org/api-guide/relations/#nested-relationships

答案 1 :(得分:0)

如果您正在为详细信息视图执行此操作,则还应为地址模型实现序列化程序。有关嵌套序列化程序关系,请参阅this example。此外,在api视图中,您必须根据request.user。

进行查询

如果您为列表视图执行此操作,PersonSerializer应具有Seri​​alizerMethodField。有了这个,用户将能够看到自己的地址,并且无法看到其他人的地址。

class PersonSerializer(serializers.ModelSerializer):
    addresses = serializers.SerializerMethodField('get_addresses')

    class Meta:
        fields = (..., "addresses", ...)

    def get_addresses(self, obj):
        if obj.pk != self.context['request'].user.pk:
            return ""
        else:
            return obj.addresses

P.S:我认为您的自定义用户模型是Person,因为您没有提供太多信息。