代码之家  ›  专栏  ›  技术社区  ›  max

django restful api-如何序列化外键

  •  0
  • max  · 技术社区  · 7 年前

    我从文档中选取了模型示例:

    https://www.django-rest-framework.org/api-guide/relations/#stringrelatedfield

    以下是我的序列化程序:

    from rest_framework import serializers
    from .models import *
    
    class AlbumSerializer(serializers.ModelSerializer):
        tracks = serializers.StringRelatedField(many=True)
    
        class Meta:
            model = Album
            fields = ('album_name', 'artist', 'tracks')
    
    
    class TrackSerializer(serializers.ModelSerializer):
        class Meta:
            model = Track
            fields = ('order', 'title', 'duration', 'album')
    

    def index(request):
        if Track.objects.all().count() == 0:
            album = Album.objects.create(album_name='something', artist='John')
            Track.objects.create(album=album, order=1, title='something', duration=1)
    
        print TrackSerializer(instance=Track.objects.all()[0]).data
        return render(request, 'index.html')
    

    打印声明给了我:

    2 回复  |  直到 7 年前
        1
  •  2
  •   JPG    7 年前

    在相应的示例中,它们用于返回 Album 的数据,而您正试图返回/打印 Track 中国的数据。

    因此,如果您尝试以下操作,它将按照DRF文档中的描述/显示打印/返回数据

    def index(request):
        if Track.objects.all().count() == 0:
            album = Album.objects.create(album_name='something', artist='John')
    
            print(AlbumSerializer(album).data)  # this will print the data as explianed in the doc
    
            Track.objects.create(album=album, order=1, title='something', duration=1)
    
        return render(request, 'index.html')

    如果您想显示与之相关的详细信息 album AlbumNewSerializer 并将其链接到 TrackSerializer

    class AlbumNewSerializer(serializers.ModelSerializer):
        class Meta:
            model = Album
            fields = ('album_name', 'artist')
    
    
    class TrackSerializer(serializers.ModelSerializer):
        album = AlbumNewSerializer()
    
        class Meta:
            model = Track
            fields = ('order', 'title', 'duration', 'album')

    笔记 AlbumSerializer 而不是 蛋白序列化器 ,但结果可能是丑陋的嵌套方式(未测试…)

        2
  •  0
  •   Red Cricket    7 年前

    class TrackSerializer(serializers.ModelSerializer):
        album = AlbumSerializer(…)
    
        ...
    
    推荐文章