Фреймворк Django rest содержит множество реляционных полей

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я пытаюсь создать приложение, которое позволяет мне загружать свои работы, а также иметь карусель с подмножеством этих работ. Я хочу иметь объект Carousel, для которого я выбираю изображения.

 from django.db import models
from artwork.models import Artwork

# Carousel Model references the artworks in a many to many field

class Carousel(models.Model):
    carouseltitle = models.CharField(max_length=200,)
    artwork = models.ManyToManyField(Artwork)
    
    class Meta:
        verbose_name = 'Carousel'
        verbose_name_plural = 'Carousels'

    def __str__(self):
        return self.carouseltitle
  

В моем сериализаторе очень просто создает то, что я хочу, за исключением извлечения полей оформления:

 from rest_framework import serializers
from .models import Carousel
from artwork.models import Artwork


class CarouselSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = Carousel
        fields = ('id', 'carouseltitle', 'artwork')
  

Мое мнение:

 from django.shortcuts import render
from .models import Carousel
from .serializers import CarouselSerializer
from rest_framework import generics

# Create your views here.
class CarouselListCreate(generics.ListCreateAPIView):
    queryset = Carousel.objects.all()
    serializer_class = CarouselSerializer
  

Создает этот вывод:

 [
    {
        "id": 7,
        "carouseltitle": "Home",
        "artwork": [
            2,
            4,
            6
        ]
    }
]
  

Для списка иллюстраций я хочу указать поле из иллюстрации, такое как URL-адрес изображения и заголовок, а не только PK. Для меня все, что я пытаюсь, выдает ошибки. Может ли кто-нибудь направить меня в правильном направлении?

Ответ №1:

Вам нужно создать ModelSerializer для оформления, а затем использовать его в своем CarouselSerializer :

 class ArtworkSerializer(serializers.ModelSerializer):
    class Meta:
        model = Artwork
        fields = artwork_fields_to_show


class CarouselSerializer(serializers.ModelSerializer):
    artwork = ArtworkSerializer(many=True)

    class Meta:
        model = Carousel
        fields = ('id', 'carouseltitle', 'artwork')
  

Вам также не нужно объявлять, что ID является полем только для чтения 🙂

Комментарии:

1. Я знал, что это должно быть просто. Спасибо за простое для понимания объяснение.