我要执行以下操作:
models.py
class MyModel(TimeStampedModel, models.Model):
name = models.CharField(max_length=100)
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
serializers.py
class MyModelSerializerCreate(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = (
'name',
)
我想在
request.user
中将当前用户添加为所有者。目前,我是通过直接与用户更新request.data,然后将更新的数据传递给我的序列化器,直接添加到我的 View 中。
data = request.data
# Add owner to data
data["owner"] = request.user.pk
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
我想直接在我的序列化器中执行此操作,但是找不到合适的方法,因为它对我来说就像是数据验证。这是一个好主意吗 ?我应该保留这种逻辑还是将其移到序列化程序中?
最佳答案
您可以从序列化程序上下文中获取用户:self.context['request'].user
它是通过get_serializer_context
方法传递的,该方法最初是在GenericAPIView
中创建的:
class GenericAPIView(APIView):
....
def get_serializer_context(self):
"""
Extra context provided to the serializer class.
"""
return {
'request': self.request,
'format': self.format_kwarg,
'view': self
}
在序列化器内部,您需要重写create
方法:class MyModelSerializerCreate(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('name', )
def create(self, validated_data):
validated_data['owner'] = self.context['request'].user
return super(MyModelSerializerCreate, self).create(validated_data)
如果需要与update
模型进行特殊交互,则还可以覆盖delete
和User
方法。
关于Django Rest在保存时将数据添加到序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42346200/