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

标签 python django django-rest-framework

Django 1.7

DRF 3.3.2

Python 2.7

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

我的第一个想法是重写我的 View 中的更新方法,如下所示:

View .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 数据。然而,这感觉有点老套,我相信有更好的方法。

第二种解决方案:

我使用 get_serializer 方法传递用户:

View .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 方法访问它:

序列化器.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 值。

最佳答案

实现您想要的效果的最简单方法是重写 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)

关于python - Django Rest Framework 设置默认 PrimaryKeyRelated 字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35990589/

相关文章:

django - Sphinx 文档和 autodoc-skip-member

python - Django 休息框架 : Get detail view using a field other than primary key integer id

python - DRF - 过滤 2 个模型

python - 宇宙飞船对象

python - 慢慢改变 BigQuery 的查找缓存 - Dataflow Python Streaming SDK

python - 使用 Django 进行两步用户注册

django 2.1.3 'django.db.backends.postgis' 不是可用的数据库后端

django - 嵌套路由器与过滤器

python - 使用 Pika 客户端轮询 RabbitMQ 消息

python - 路径中的转义序列