django restful api - как сериализовать внешние ключи - PullRequest
0 голосов
/ 11 декабря 2018

Я использую django 1.8 с djangorestframework == 3.6.3.Я взял примеры моделей из документации:

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

Оператор печати дает мне: {'duration': 1, 'album': 1, 'order':1, 'title': u'something '} Почему он не дает мне все данные о поле для соответствующего альбома?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я думаю, вам нужно сделать что-то вроде этого:

class TrackSerializer(serializers.ModelSerializer):
    album = AlbumSerializer(…)

    ...
0 голосов
/ 11 декабря 2018

В соответствующем примере они использовали для возврата данных Album, тогда как вы пытаетесь вернуть / напечатать Track данных.

Итак, если вы попробуете, как показано ниже, он напечатает / вернет данные, как описано / показано в документе DRF

def index(request):
    if Track.objects.all().count() == 0:
        album = Album.objects.create(album_name='something', artist='John')

        <b>print(AlbumSerializer(album).data)  # this will print the data as explianed in the doc</b>

        Track.objects.create(album=album, order=1, title='something', duration=1)

    return render(request, 'index.html')

Если вы хотите показать детали, обработанные до album, создайте новый сериализатор альбомов, AlbumNewSerializer и свяжите его в TrackSerializer как,

<b>class AlbumNewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Album
        fields = ('album_name', 'artist')</b>


class TrackSerializer(serializers.ModelSerializer):
    <b>album = AlbumNewSerializer()</b>

    class Meta:
        model = Track
        fields = ('order', 'title', 'duration', 'album')

NOTE : Вы можете использовать AlbumSerializer вместо AlbumNewSerializer, но результат может быть безобразно вложенным (не проверено ..)

...