DRF - 修改序列化器响应的位置?

时间:2016-01-04 00:40:51

标签: django-rest-framework

我需要加密/解密从Django Rest Framework提供的数据。

models.py

class Widget(models.Model):
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=1024)
    username = models.CharField(max_length=50)
    code = models.CharField(max_length=1024)
    owner = models.ForeignKey('MyAppUser', related_name='MyAppUser_owner')
    list = models.ForeignKey('WidgetList')

根据登录的用户,密钥会有所不同。

serializers.py

class WidgetSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    list = serializers.CharField(source='list.name')

    class Meta:
        model=Widget
        fields = ('id', 'title', 'description', 'username', 'code', 'owner', 'list')

views.py

class WidgetList(generics.ListCreateAPIView):
    queryset = Widget.objects.all()
    serializer_class = WidgetSerializer
    filter_class = WidgetFilter

    def get_queryset(self):
        owner = self.request.user
        return super(WidgetList, self).get_queryset().filter(owner=self.request.user)

因此,根据登录的用户(每个用户的用户密钥不同),我需要运行以下代码 -

GET

for object in queryset:
    object.code = decrypt_code(masterkey,
                                       userkey,
                                       object.code)

POST

object.code = encrypt_code(masterkey,
                                   userkey,
                                   object.code)

如何在不破坏现有过滤器代码的情况下将此代码集成到视图中,或者如何将其集成到序列化器中?

1 个答案:

答案 0 :(得分:1)

解密,您可以在序列化程序中覆盖.validate_code()方法。 要加密,您可以覆盖序列化程序中的.to_representation()方法。

您可以了解更多信息here