Django rest framework 解决外键字段serialize的修改问题
时间: 2023-11-23 19:07:15 浏览: 129
在 Django Rest Framework 中,如果一个模型有外键字段,需要在序列化时将这个外键字段展开(Flatten)成另一个模型的详细信息。这个过程通常通过使用 Serializer 或 ModelSerializer 类来实现。
但是,当我们想要修改这个外键字段时,会遇到一个问题:我们无法直接将外键字段的 id 传递给后端进行修改,因为 DRF 默认不支持这个操作。为了解决这个问题,我们可以自定义一个 Serializer。
下面是一个自定义的 Serializer 类例子:
```python
from rest_framework import serializers
from myapp.models import MyModel, RelatedModel
class RelatedModelSerializer(serializers.ModelSerializer):
class Meta:
model = RelatedModel
fields = ('id', 'name')
class MyModelSerializer(serializers.ModelSerializer):
related_model = RelatedModelSerializer()
class Meta:
model = MyModel
fields = ('id', 'name', 'related_model')
def update(self, instance, validated_data):
related_model_data = validated_data.pop('related_model', None)
if related_model_data:
related_model_serializer = RelatedModelSerializer(instance=instance.related_model, data=related_model_data)
if related_model_serializer.is_valid():
related_model_serializer.save()
return super(MyModelSerializer, self).update(instance, validated_data)
```
在这个例子中,我们定义了两个 Serializer 类:RelatedModelSerializer 和 MyModelSerializer。
在 MyModelSerializer 中,我们展开了外键字段 related_model。在 update 方法中,我们先从 validated_data 中弹出 related_model 字段(Flat)的数据,然后用这些数据实例化 RelatedModelSerializer,接着检查是否有效,如果有效,就保存这个实例。最后我们调用父类的 update 方法。
这个例子中,我们只演示了如何修改一个外键字段,但是这种方法同样适用于创建和删除外键字段。
阅读全文