具有外键的Django REST Framework序列化模型

时间:2019-07-15 13:24:21

标签: django django-rest-framework

一个简单的问题:

我有下一个型号:

class Artist(models.Model):
    name = models.CharField(...)
    surname = models.CharField(...)
    age = models.IntegerField(...)

clas Album(models.Model):
    artist = models.ForeignKey(Artist, ...)
    title = models.CharField(...)

我希望创建一个相册序列化器,

  • 在GET上显示艺术家信息
  • 可以在POST上使用pk链接艺术家

我可以使用以下序列化程序使用pk进行POST,但我不知道如何在同一序列化程序中获取艺术家信息:

class AlbumSerializer(serializers.ModelSerializer):
    class Meta:
        model = Album
        fields = '__all__'

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以覆盖AlbumSerializer的{​​{3}}:

class AlbumSerializer(serializers.ModelSerializer):

    def to_representation(self, obj):
        data = super().to_representation(obj)
        data['artist'] = ArtistSerializer(obj.artist).data
        return data

    class Meta:
        model = Album
        fields = '__all__'

答案 1 :(得分:0)

我相信您要查找的内容与此API ReferenceStringRelatedField

相关

这取决于您如何在__str__类中配置Artist方法。

models.py

class Artist(models.Model):
    name = models.CharField(...)
    surname = models.CharField(...)
    age = models.IntegerField(...)

    def __str__(self):
        return "{name} {surname} - {age} years old".format(
            name=self.name, surname=self.surname, age=self.age)

serializers.py

class AlbumSerializer(serializers.ModelSerializer):
    artist = serializers.StringRelatedField(many=True)

    class Meta:
        model = Album
        fields = ['artist, ...']

答案 2 :(得分:0)

我不确定我是否完全理解您的问题,但是如果要链接两个序列化程序,则必须执行以下操作:

class ArtistSerializer(serializers.ModelSerializer):
    class Meta:
        model = Artist
        fields = '__all__'


class AlbumSerializer(serializers.ModelSerializer):
    artist = ArtistSerializer()
    class Meta:
        model = Album
        exclude = '__all__'

但是,如果您只想响应GET请求,则应在GET方法中包含请求对象,该方法本质上应包含Album ID,然后可以将两个模型链接在一起:

Album.objects.filter(pk=request['album_id']).first().artist

并获取与特定专辑相关的艺术家。