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 值。
最佳答案
实现您想要的效果的最简单方法是重写 PlaylistViewSet
的 perform_create
和 perform_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/