Django Rest框架:在GET响应中发送完整的外键对象,但在POST负载中只接受外部id,没有两个序列化器?<



假设我有两个模型:

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,
"id": 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']

最新更新