首页 文章

Django Rest Framework设置默认的PrimaryKeyRelated字段值?

提问于
浏览
0

Django 1.7

DRF 3.3.2

Python 2.7

在我的API中,我想为用户字段设置默认值 . 例如,我有一个播放列表模型,我想确保在创建和更新时始终从request.user设置用户 .

我的第一个想法是在我的视图中覆盖更新方法,如下所示:

views.py

class PlaylistViewSet(viewsets.ModelViewSet):
    serializer_class = PlaylistSerializer
    lookup_field = 'id'

    def update(self, request, *args, **kwargs):
        request.POST._mutable = True
        request.POST['user'] = request.user.id
        request.POST._mutable = False
        return super(PlaylistViewSet, self).update(request, *args, **kwargs)

这只会覆盖我想要始终设置的值的任何POST数据 . 然而,这感觉很糟糕,我相信有更好的方法 .

Second solution:

我用get_serializer方法传递用户:

views.py

class PlaylistViewSet(viewsets.ModelViewSet):
    serializer_class = PlaylistSerializer
    lookup_field = 'id'

    def get_serializer(self, *args, **kwargs):
        kwargs['user'] = self.request.user
        return super(PlaylistViewSet, self).get_serializer(*args, **kwargs)

然后我可以从序列化程序init方法访问它:

serializers.py

class PlaylistSerializer(serializers.ModelSerializer):
    user = PrimaryKeyRelatedField(allow_null=True, queryset=User.objects.all(), required=False)    
    class Meta:
        model = Playlist

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        # set the value of the user field here
        super(PlaylistSerializer, self).__init__(*args, **kwargs)

这就是我被困住的地方 . 我似乎无法弄清楚如何为PrimaryKeyRelated字段设置值 .

我访问该字段:

self.fields['owner']

但我无法访问其数据或设置pk值 .

1 回答

  • 2

    实现您想要的最简单方法是覆盖 PlaylistViewSetperform_createperform_update 方法(Save and deletion hooks

    class PlaylistViewSet(viewsets.ModelViewSet):
        serializer_class = PlaylistSerializer
        lookup_field = 'id'
    
        def perform_create(self, serializer):
            serializer.save(user=self.request.user)
    
        def perform_update(self, serializer):
            serializer.save(user=self.request.user)
    

相关问题