2017-09-10 2 views
0

ムービーをムービーモデルに追加すると同時にGenreモデルにジャンルを追加しようとしていますが、まだ存在しないGenreエントリを追加しようとすると、次のレスポンスオブジェクトが表示されます。それは)すでにテーブルに存在する: django rest framework 1回のリクエストで複数のテーブルのエントリを追加する方法は?

{'genres': ['Object with genre=Mystery does not exist.']} 

は、私はそれがMovieSerializerのcreate()メソッドでobject.get_or_create()を使用して動作するはずと思ったが、動作するようには思えません。

はまた、私は形式でPOSTリクエストでデータを送信しています:

{'tmdb_id': 14, 
'title': 'some movie', 
'release_date': '2011-12-12', 
'genres': ['Action', 'Mystery']} 

ことが重要かどうかわかりません。

ここでは、コードです:

Views.py

class CreateMovieView(generics.ListCreateAPIView): 
    queryset = Movie.objects.all() 
    serializer_class = MovieSerializer 

    def perform_create(self, serializer): 
     """Save the post data when creating a new movie.""" 
     serializer.save() 


class MovieDetailsView(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Movie.objects.all() 
    serializer_class = MovieSerializer 

Models.py

class Genre(models.Model): 

    genre = models.CharField(max_length=65) 

    def __str__(self): 
     return "{}".format(self.genre) 


class Movie(models.Model): 

    tmdb_id = models.IntegerField(primary_key=True) 
    title = models.CharField(max_length=255) 
    release_date = models.DateField() 
    imdb_id = models.CharField(max_length=255, blank=True) 
    img_path = models.CharField(max_length=255, blank=True) 
    runtime = models.CharField(max_length=65, blank=True) 
    synopsis = models.TextField(blank=True) 
    imdb_rating = models.DecimalField(max_digits=3, decimal_places=1, blank=True, null=True) 
    metascore = models.IntegerField(blank=True, null=True) 

    genres = models.ManyToManyField(Genre, related_name='genres', blank=True) 

    def __str__(self): 
     return "{}".format(self.title) 

serializers.py

は、

答えて

0

なぜこれがエラーではないかわかりませんが、ムービーインスタンスの作成を許可するためにビューを正しく使用していないようです。 ListCreateAPIViewはあなたが、代わりに、あなたの他のビューにCreateModelMixinを追加する必要があります 映画のリストを作成することができます:

class MovieDetailsView(generics.RetrieveUpdateDestroyAPIView, 
         mixins.CreateModelMixin): 
    queryset = Movie.objects.all() 
    serializer_class = MovieSerializer 

または、より良い、ModelViewSetを使用します。

from restframework import viewsets 

class MovieViewSet(viewsets.ModelViewSet): 
    queryset = ... 
+0

私が今実現していますModelViewSet、私はまだ同じ応答を得ています。私は今、問題は、データが正しくシリアル化されていないと考えています。私はそれをテストしようとし、それはMovieSerializerが適切にジャンルの入れ子オブジェクトをシリアル化しないようだ。直列化しようとすると '' str 'オブジェクトに' genre 'という属性がないというエラーが発生します。 –

+0

は、ModelSerializer.to_internal_data()メソッドをオーバーライドして、ジャンルを取得または作成し、新しいジャンルIDをデータに入れます。 SlugRelatedFieldがどのように機能するかを正確に把握してください。 –

関連する問題