问题描述
假设我有两个模型:
class Singer((models.Model):
name = models.CharField(max_length=200)
class Song(models.Model):
title = models.CharField(max_length=200)
singer = models.ForeignKey(Singer)
还有两个序列化器,例如:
class SingerSerializer(serializers.ModelSerializer):
class Meta:
model = Singer
fields = '__all__'
class SongSerializer(serializers.ModelSerializer):
singer = SingerSerializer()
class Meta:
model = Singer
fields = '__all__'
我已经像上面那样定义了序列化程序,因为我需要在歌曲的 GET 响应中包含完整的外键对象:
{
"singer": {
"id": 1,"name": "foo"
},"id": 1,"title": "foo la la"
}
有没有办法允许 POST/PATCH 有效负载只发送外部对象的 id 而不是整个对象,而无需编写不同的序列化程序?我希望 PATCH 负载是这样的:
{
"singer": 1,"title": "foo la la"
}
解决方法
您可以通过定义 read_only 和 write_only 字段来实现这一点。
此外,通过使用 SlugRelatedField
允许 DRF 从相关模型上的字段自动填充它。
尚未测试此代码,但该想法仍然有效。
class SongSerializer(serializers.ModelSerializer):
singer = SingerSerializer(read_only=True)
singer_id = serializers.SlugRelatedField(queryset=Singer.objects.all(),slug_field='singer',write_only=True)
class Meta:
model = Singer
fields = ['singer','signer_id']