v.t*_*rey 6 django serialization django-rest-framework
我想做以下事情:
models.py
class MyModel(TimeStampedModel, models.Model):
name = models.CharField(max_length=100)
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)
serializers.py
class MyModelSerializerCreate(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = (
'name',
)
Run Code Online (Sandbox Code Playgroud)
我想添加当前用户的所有者request.user.目前我在我的视图中通过向用户提升request.data直接添加它,然后将更新的数据传递给我的序列化程序.
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)
Run Code Online (Sandbox Code Playgroud)
我想直接在我的序列化程序中执行此操作,但无法找到正确执行此操作的方法,因为它看起来像是对我进行数据验证.这是一个好主意吗 ?我应该将这个逻辑保留在我的视图中还是将其移动到我的序列化程序中?
Iva*_*kin 11
您可以从序列化程序上下文中获取用户:
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
}
Run Code Online (Sandbox Code Playgroud)
在序列化程序中,您需要覆盖一个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)
Run Code Online (Sandbox Code Playgroud)
如果需要与模型进行一些特殊交互,也可以覆盖update和delete方法user.
| 归档时间: |
|
| 查看次数: |
4457 次 |
| 最近记录: |