Создайте модель, список должен возвращать все фильмы с его участием, агрегировать общее количество фильмов с его участием (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']

теперь он работает нормально он показывает количество актеров в фильме

Вернуться на верх