使用 Django REST 进行动态序列化
Dynamical serialization with Django REST
我有一个 Person
模型,还有一个 Address
模型。一个 person
可以有多个地址,所以 Address
模型看起来像:
Address(models.Model):
person = models.ForeignKey(Person, related_name="addresses")
...
我想序列化一个person
实例,我做了最简单的事情:
PersonSerializer(serializers.ModelSerializer):
class Meta:
fields = (..., "addresses", ...)
但是,假设我要根据当前request.user
序列化addresses
,让不同的当前user
查看不同的地址集,应该如何我修改代码?
我假设您想要一个像 /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 转储请求用户。如果您相应地设置 'addresses' 序列化程序字段,相关的地址记录就会如您所愿,如下所述:
http://www.django-rest-framework.org/api-guide/relations/#nested-relationships
如果您为详细信息视图执行此操作,您也应该为地址模型实现一个序列化程序。有关嵌套序列化程序关系,请参阅 this example。此外,在您的 api 视图中,您必须根据 request.user.
进行查询
如果您为列表视图执行此操作,PersonSerializer 应该有一个 SerializerMethodField。这样,用户将能够看到自己的地址,而不能看到其他人的地址。
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,因为您没有提供太多信息。
我有一个 Person
模型,还有一个 Address
模型。一个 person
可以有多个地址,所以 Address
模型看起来像:
Address(models.Model):
person = models.ForeignKey(Person, related_name="addresses")
...
我想序列化一个person
实例,我做了最简单的事情:
PersonSerializer(serializers.ModelSerializer):
class Meta:
fields = (..., "addresses", ...)
但是,假设我要根据当前request.user
序列化addresses
,让不同的当前user
查看不同的地址集,应该如何我修改代码?
我假设您想要一个像 /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 转储请求用户。如果您相应地设置 'addresses' 序列化程序字段,相关的地址记录就会如您所愿,如下所述:
http://www.django-rest-framework.org/api-guide/relations/#nested-relationships
如果您为详细信息视图执行此操作,您也应该为地址模型实现一个序列化程序。有关嵌套序列化程序关系,请参阅 this example。此外,在您的 api 视图中,您必须根据 request.user.
进行查询如果您为列表视图执行此操作,PersonSerializer 应该有一个 SerializerMethodField。这样,用户将能够看到自己的地址,而不能看到其他人的地址。
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,因为您没有提供太多信息。