Ошибка сериализаторов "многие ко многим" в post api
У меня есть отношения "многие-ко-многим" между Movie и Person через Cast. Я использую CastSerializer для создания метода post для создания нового фильма и нового отношения cast, но когда вызываю метод post, ответ возвращает AttributeError. Я хочу, чтобы тело сообщения выглядело следующим образом:
{
...
"title": "string",
"genres": [
0
],
"cast": [
{
"charactor": "string",
"cast": 0,
"order": 2147483647
}
]
}
AttributeError at /movie/
Got AttributeError when attempting to get a value for field `cast` on serializer `MoviesSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Movie` instance.
Original exception text was: 'Movie' object has no attribute 'person'.
это модели:
class Movie(models.Model):
...
cast = models.ManyToManyField(Person,related_name='cast_movies', through="Cast")
def __str__(self):
return self.title
class Cast(models.Model):
id = models.AutoField(primary_key=True,null=False,blank=False)
movie = models.ForeignKey(Movie,on_delete=models.CASCADE,related_name='casts')
cast = models.ForeignKey(Person,on_delete=models.CASCADE,related_name='person')
charactor = models.CharField(max_length=200,null=True,blank=True,default='')
order = models.IntegerField(null=True)
def __str__(self):
return self.cast.name + " ("+ self.movie.title + ")"
сериализаторы:
class CastSerializer(serializers.ModelSerializer):
class Meta:
model = Cast
fields = ['charactor','cast','order']
class MoviesSerializer(serializers.ModelSerializer):
genres = serializers.SlugRelatedField(
many=True, queryset=Genre.objects.all(),slug_field='id'
)
cast = CastSerializer(many = True)
class Meta:
model = Movie
fields = [ ...,'cast']
def create(self, validated_data):
genres_data = validated_data.pop('genres', [])
cast_data = validated_data.pop('cast', [])
movie = Movie.objects.create(**validated_data)
for cast in cast_data:
Cast.objects.create(movie_id = movie.id,**cast)
genresInstances = []
for genre in genres_data:
genresInstances.append(genre)
movie.genres.set(genresInstances)
return movie