Python 如何在序列化程序验证/保存到DRF之前添加其他数据?

Python 如何在序列化程序验证/保存到DRF之前添加其他数据?,python,django,http,django-rest-framework,Python,Django,Http,Django Rest Framework,所以我有一节课: class MyClass(models.Model): name = models.CharField(max_length=100) created_time = models.DateTimeField(auto_now_add = True) modified_time = models.DateTimeField(auto_now = True) 然后是表示MyClass相关照片的其他类: class MyPhoto(mode

所以我有一节课:

class MyClass(models.Model):    
    name = models.CharField(max_length=100)    
    created_time = models.DateTimeField(auto_now_add = True)
    modified_time = models.DateTimeField(auto_now = True)
然后是表示MyClass相关照片的其他类:

class MyPhoto(models.Model):
    myclass = models.ForeignKey(MyClass, unique=False, related_name='photos')
    photo = models.ImageField(upload_to='photos',blank=False)
我想创建一个端点,它将处理照片上传(内容类型将是multipart,关联myclass的id将在url中传递),因此我有:

URL.py:

router = routers.DefaultRouter()    
router.register(r'photos/(?P<myclass_id>\d+)',PhotoViewSet)
和序列化程序:

class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyPhoto
        fields = ('myclass','photo')
正如您所看到的,我向serializer.save(myclass=myclass)方法添加了额外的属性myclass

但是,如果我上传照片并在url中正确传递myclass id,我会得到此字段是必需的。错误。如果我在上传的带有照片的多部分表单中添加正确的myclass超链接,请求将通过验证,然后表单中的myclass将替换为url id中的myclass


我如何才能做到这一点,因此,如果我只将照片发布到url,那么pk=2的此照片和myclass的实例将保存到db?

这是因为您在序列化程序的元字段中指定了
myclass
。这使得DRF需要并验证它作为POST数据的一部分。您自己设置的任何字段都不应该是序列化程序字段的一部分。因此,您只需从
Meta.fields
中删除
myclass

class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyPhoto
        fields = ('photo', )
class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyPhoto
        fields = ('photo', )