Python 如何从视图中分配DRF序列化程序只读字段
示例代码Python 如何从视图中分配DRF序列化程序只读字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,示例代码 #models.py 类配置文件(models.Model): first_name=models.CharField(最大长度=64) last_name=models.CharField(最大长度=64) ... 班级照片(模特。模特): image=models.ImageField(上传到='photos') profile=models.ForeignKey('profile',on_delete=models.CASCADE,related_name='photos') .
#models.py
类配置文件(models.Model):
first_name=models.CharField(最大长度=64)
last_name=models.CharField(最大长度=64)
...
班级照片(模特。模特):
image=models.ImageField(上传到='photos')
profile=models.ForeignKey('profile',on_delete=models.CASCADE,related_name='photos')
...
#序列化程序.py
类探查器序列化器(serializers.ModelSerializer):
photos=序列化程序。HyperlinkedRelatedField(many=True,view\u name='photo-detail',read\u only=True)
类元:
模型=外形
字段='\uuuu所有\uuuu'
类PhotoSerializer(serializers.ModelSerializer):
#如何从视图中隐式分配此参数?
profile=PrimaryKeyRelatedField(只读=True)
类元:
模型=面
字段='\uuuu所有\uuuu'
我的解决方案
#views.py
类ProfileViewSet(viewsets.ModelViewSet):
queryset=Profile.objects.all()
serializer\u class=探查器序列化器
@操作(方法=['GET','POST'],细节=True,序列化程序\类=FaceSerializer)
def照片(自我、请求、*args、**kwargs):
profile=self.get_对象()
如果request.method==“GET”:
...
elif request.method==“POST”:
serializer=self.get\u序列化程序(data=request.data)
序列化程序。_是否有效()
#访问已验证的数据
#显式设置配置文件只读字段
序列化程序。已验证的_数据['profile']=profile
self.perform\u创建(序列化程序)
返回响应(serializer.data)
示例呼叫
curl-X POSThttp://localhost:8000/profiles/4/photos/ --表单image=@photo_image.jpg
预期行为
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"id": 123,
"profile": 4,
"image": "http://localhost:9000/media/photos/photo_image.jpg",
....
}
将照片图像传递到端点/profile//photos/
时,已通过提取的
视图参数设置照片的(只读=True
)配置文件字段
问题
有没有更优雅的方法来实现这一点?我不喜欢访问
序列化程序。验证\u数据并显式设置配置文件值 在序列化程序的保存()方法中传递配置文件
值,如下所示
...
elif request.method == 'POST':
serializer = self.get_serializer(data=request.data)
serializer.is_valid()
serializer.save(profile=profile)
return Response(serializer.data)
。。。
elif request.method==“POST”:
serializer=self.get\u序列化程序(data=request.data)
序列化程序。_是否有效()
serializer.save(profile=profile)
返回响应(serializer.data)