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)