Django Rest Framework:在 GET 响应中发送完整的外键对象,但在 POST 有效负载中只接受外键,没有两个序列化程序?

问题描述

假设我有两个模型:

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']

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...