Создайте модель, список должен возвращать все фильмы с его участием, агрегировать общее количество фильмов с его участием (django )
Моя задача заключалась в следующем. **Создать модель актера, список должен возвращать все фильмы с его участием, агрегировать общее количество фильмов с его участием. Создать модель жанра, список должен возвращать все фильмы этого жанра, суммарное количество фильмов. Создайте модель фильма, которая имеет поля name, actors и genre. Здесь актеры и жанр должны быть отношениями "много-много" **
Я сделал следующее models.py
from django.db import models
class Actor(models.Model):
actors = models.CharField(max_length=100)
def __str__(self):
return self.actors
class Genre(models.Model):
genre = models.CharField(max_length=100)
def __str__(self):
return self.genre
class Movie(models.Model):
name = models.CharField(max_length=100)
actors = models.ManyToManyField(Actor)
genre = models.ManyToManyField(Genre)
def __str__(self):
return self.name
serializer.py
from rest_framework import serializers
from .models import Movie,Genre,Actor
class ActorSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Actor
fields = ['url','actors']
class GenreSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Genre
fields = ['genre']
class MovieSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Movie
fields = ['url','name','actors','genre']
views.py
from django.shortcuts import render
from rest_framework import viewsets
# Create your views here.
from .serializers import MovieSerializer,ActorSerializer,GenreSerializer
from .models import Movie,Actor,Genre
from django.db.models import Count
class movie(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
class actor(viewsets.ModelViewSet):
queryset = Actor.objects.all()
serializer_class = ActorSerializer
class genre(viewsets.ModelViewSet):
queryset = Genre.objects.all()
serializer_class=GenreSerializer
urls.py
from django.urls import include, path
from rest_framework import routers
from .views import *
# define the router
router = routers.DefaultRouter()
# define the router path and viewset to be used
router.register(r'movie', movie)
router.register(r'actor', actor)
router.register(r'genre',genre)
urlpatterns = [
path('', include(router.urls)),
]
Я не могу сделать эту часть ** Список должен возвращать все фильмы с его участием, суммарное количество фильмов с его участием **
Вам необходимо установить поле related_name, если вы хотите получить связанные поля.
class Movie(models.Model):
name = models.CharField(max_length=100)
actors = models.ManyToManyField(Actor, related_to = "actor_movies")
genre = models.ManyToManyField(Genre, related_to = "genre_movies")
def __str__(self):
return self.name
Затем вам нужно добавить RelatedField в файл serialzers.py,
class ActorSerializer(serializers.HyperlinkedModelSerializer):
actor_movies = serializers.RelatedField(many = True, read_only = True)
class Meta:
model = Actor
fields = ['url','actors', 'actor_movies']
class GenreSerializer(serializers.HyperlinkedModelSerializer):
genre_movies = serializers.RelatedField(many = True, read_only = True)
class Meta:
model = Genre
fields = ['genre', 'genre_movies']
Потом в JSON можно получить фильмы о нем, фильмы этого жанра и т.д. Надеюсь, это может помочь.
class ActorSerializer(serializers.HyperlinkedModelSerializer):
count_actor_movies = serializers.SerializerMethodField()
def get_count_actor_movies(self, instance):
return instance.actor_movies.count()
class Meta:
model = Actor
fields = ['id','actors','count_actor_movies']
теперь он работает нормально он показывает количество актеров в фильме