Skip to content

Instantly share code, notes, and snippets.

@rg3915
Last active April 19, 2023 18:25
Show Gist options
  • Save rg3915/86832560603fccdb1fd0c8f0a89bb872 to your computer and use it in GitHub Desktop.
Save rg3915/86832560603fccdb1fd0c8f0a89bb872 to your computer and use it in GitHub Desktop.
drf nested serializers relacionamento reverso

O que você quer é um relacionamento reverso.

No Postman você precisa inserir os dados da seguinte forma:

endpoint: http://localhost:8000/api/v1/series/

{
    "titulo": "The Hundred",
    "temporadas": [
        { "temporada": "1" },
        { "temporada": "2" },
        { "temporada": "3" },
        { "temporada": "4" },
        { "temporada": "5" },
        { "temporada": "6" },
        { "temporada": "7" }
    ]
}
from django.contrib import admin
from backend.serie.models import Serie, Temporada, Capitulo
class TemporadaInline(admin.TabularInline):
model = Temporada
extra = 0
@admin.register(Serie)
class SerieAdmin(admin.ModelAdmin):
inlines = (TemporadaInline, )
list_display = ('__str__',)
search_fields = ('name',)
class CapituloInline(admin.TabularInline):
model = Capitulo
extra = 0
@admin.register(Temporada)
class TemporadaAdmin(admin.ModelAdmin):
inlines = (CapituloInline,)
list_display = ('__str__', 'serie')
search_fields = ('name',)
@admin.register(Capitulo)
class CapituloAdmin(admin.ModelAdmin):
list_display = ('__str__', 'url')
search_fields = ('name',)
from django.db import models
class Serie(models.Model):
titulo = models.CharField(max_length=255)
def __str__(self):
return self.titulo
class Temporada(models.Model):
temporada = models.CharField(max_length=2)
serie = models.ForeignKey(
Serie,
on_delete=models.SET_NULL,
null=True,
blank=True
)
def __str__(self):
return f'{self.serie} {self.temporada}'
class Capitulo(models.Model):
capitulo = models.CharField(max_length=2)
url = models.URLField(null=True, blank=True)
temporada = models.ForeignKey(
Temporada,
on_delete=models.SET_NULL,
null=True,
blank=True
)
def __str__(self):
return f'{self.temporada} {self.capitulo}'
from rest_framework import serializers
from backend.serie.models import Capitulo, Serie, Temporada
class CapituloSerializer(serializers.ModelSerializer):
class Meta:
model = Capitulo
fields = '__all__'
depth = 1
class TemporadaSerializer(serializers.ModelSerializer):
class Meta:
model = Temporada
fields = '__all__'
depth = 1
class SerieSerializer(serializers.ModelSerializer):
# Nested Serializer
temporadas = TemporadaSerializer(many=True, source='temporada_set')
class Meta:
model = Serie
fields = ['id', 'titulo', 'temporadas']
from rest_framework import status, viewsets
from rest_framework.response import Response
from backend.serie.models import Capitulo, Serie, Temporada
from backend.serie.serializers import CapituloSerializer, SerieSerializer, TemporadaSerializer
class CapituloViewSet(viewsets.ModelViewSet):
queryset = Capitulo.objects.all()
serializer_class = CapituloSerializer
class TemporadaViewSet(viewsets.ModelViewSet):
queryset = Temporada.objects.all()
serializer_class = TemporadaSerializer
class SerieViewSet(viewsets.ModelViewSet):
queryset = Serie.objects.all()
serializer_class = SerieSerializer
def create(self, request, *args, **kwargs):
data = request.data
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
temporadas = data.pop('temporadas')
serie = Serie.objects.create(**data)
for temporada in temporadas:
obj_temporada = Temporada.objects.create(**temporada)
obj_temporada.serie = serie
obj_temporada.save()
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment