【问题标题】:How to retrieve foreign key field in Django rest framework?如何在 Django REST 框架中检索外键字段?
【发布时间】:2017-11-02 05:45:02
【问题描述】:

鉴于下面的模型和序列化程序类,当我检索 Track 详细信息时,它只会显示 Track 标题而不显示相关的 Artist。

在检索曲目详细信息时如何显示艺术家姓名?

models.py

class Artist (models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Track (models.Model):    
    artist = models.ForeignKey(Artist, blank=True, null=True, on_delete=models.SET_NULL, verbose_name="Artist")
    title = models.CharField(max_length=100, verbose_name="Title")

    def __str__(self):
        return self.title

serializers.py

class ArtistSerializer(serializers.ModelSerializer):

    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()

    class Meta:
        model = Artist
        fields = ('id', 'name')

class TrackSerializer(serializers.ModelSerializer):

    class Meta:
        model = Track
        fields = '__all__'

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    我认为你需要自定义字段,试试这个序列化器:

    class TrackSerializer(serializers.ModelSerializer):
        class Meta:
            model = Track
            fields = ('title', 'artist','artist_name')
    
        artist_name = serializers.SerializerMethodField('get_artists_name')
    
        def get_artists_name(self, obj):
            return obj.artist.name
    

    它会产生类似的东西。

    [
        {
            "title": "Don't let me down",
            "artist": 2,
            "artist_name": "The Beatles"
        },
        {
            "title": "Summertime",
            "artist": 1,
            "artist_name": "Ella Fitzgerald"
        }
    ]
    

    【讨论】:

      【解决方案2】:

      在当前版本的 DRF 中,您可以简单地执行此操作

      class TrackSerializer(serializers.ModelSerializer):
          
          artist = serializers.StringRelatedField()
      
          class Meta:
              model = Track
              fields = '__all__'
      

      StringRelatedField 可用于使用其__str__ 方法表示关系的目标。

      REF

      【讨论】:

        【解决方案3】:

        试试这个序列化器,

        class ArtistSerializer(serializers.ModelSerializer):
        
            class Meta:
                model = Artist
                fields = '__all__' # or array of fieldnames like ['name_1', 'name_2']
        
        class TrackSerializer(serializers.ModelSerializer):
            artist = ArtistSerializer()
        
            class Meta:
                model = Track
                fields = ('title', 'artist')
        

        为了检索 Artist 详细信息,这是一个 ForeignKey 模型,您需要在 django-rest-framework 中使用嵌套序列化程序。

        通过使用带有嵌套 ArtistSerializer 的 TrackSerializer,检索到的数据将如下所示,

        {
            "title": "Some_Title",
            "artist": {
                           "id": 2, #or id of the artist.
                           "name": "Artist_name"
                       }
        }
        

        【讨论】:

        • 如何访问artist.name?
        • 艺术家姓名将在 ArtistSerializer 中,它包含在 TrackSerializer 中
        • 例如,我不想传递所有艺术家字段。只是艺术家名称或特定字段。有没有办法做到这一点?
        • 是的,你可以在fields属性中指定字段名,比如fields = ['your_field_name', 'other_name_if_available']
        【解决方案4】:

        你可以在官方的 django rest 框架中看到documentations 您应该为嵌套项目定义一个序列化器字段

        首先创建您的 Artist(嵌套项)序列化程序

        class ArtistSerializer(serializers.ModelSerializer):
        
            id = serializers.IntegerField(read_only=True)
            name = serializers.CharField()
        
            class Meta:
                model = Artist
                fields = ('id', 'name')
        

        然后你可以在相关的模型序列化器上使用它

        class TrackSerializer(serializers.ModelSerializer):
            artist = ArtistSerializer()
        
            class Meta:
                model = Track
                fields = ('title', 'artist')
        

        【讨论】:

          猜你喜欢
          • 2016-10-04
          • 1970-01-01
          • 1970-01-01
          • 2013-03-06
          • 1970-01-01
          • 2014-07-30
          • 2019-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多