Задать вопрос
@pistollo

Django REST Framework: не выводятся поля related объектов?

Всем привет!

Столкнулся с тем, что при сериализации простого объекта не выводятся связанные объекты (а точнее поля связанного объекта,кроме ID), как указано в туториале Serializer relations
Собственно, весь код оттуда
models.py
class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __str__(self):
        return '%d: %s' % (self.order, self.title)


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

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')


views.py
@api_view(['GET',])
@permission_classes((AllowAny,))
def album_list(request):
    if request.method == 'GET':
        albums = Album.objects.all().prefetch_related('tracks')
        album_serializer = AlbumSerializer(albums, many=True)
        return Response(album_serializer.data)


На выходе JSON получаю просто Track с ID:
{"data":[{"type":"album_list","id":"1","attributes":{"album_name":"Ride the Lightning","artist":"Metallica"},"relationships":{"tracks":{"data":[{"type":"Track","id":"1"},{"type":"Track","id":"2"},{"type":"Track","id":"3"}],"meta":{"count":3}}}},{"type":"album_list","id":"2","attributes":{"album_name":"Metallica","artist":"Vetallica"},"relationships":{"tracks":{"data":[],"meta":{"count":0}}}}]}

Ожидание-как в примере, получить что то типа
'tracks': [
'1: Sunflower',
'2: Whitetail',
'3: Dinosaur Act',
...

Перекопал весь интернет, опробовал в нескольких тестовых проектах - опустился вот до этого простого примера-не работает. Различные методы связей тоже перепробовал. Куда можно копать?
  • Вопрос задан
  • 1235 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@pistollo Автор вопроса
Отвечу сам себе.
Проблему нашел вот в этих рендерах.
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_json_api.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
Они умудряются заваривать такую кашу,что поля дочерних элементов не возвращаются. Убил 1,5 дня на эту ерунду.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@FulTupFul
class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = '__all__'

class AlbumSerializer(serializers.ModelSerializer):
    tracks =TrackSerializer(read_only=True, many=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')
Ответ написан
Комментировать
@aglgl
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.BrowsableAPIRenderer',
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.TemplateHTMLRenderer',
),
Помогает вот это в setting.py
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы