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数据。然而,这感觉很糟糕,我相信这是一个更好的方法。
第二个解决方案:
我使用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值。
答案 0 :(得分:2)
实现目标的最简单方法是覆盖perform_create
(Save and deletion hooks)的perform_update
和PlaylistViewSet
方法
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)