2017-01-18 13 views
0

でモデルを作成することはできません私は、関連するモデルのコード作成:、私はすべてのモデルのためのシリアライザを行っている次にジャンゴREST - 関係

class Player(models.Model): 
    # Basic 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 

    # Enums 
    GOALKEEPER = 'GOALKEEPER' 
    DEFENDER = 'DEFENDER' 
    MIDFIELDER = 'MIDFIELDER' 
    FORWARD = 'FORWARD' 
    POSITION = (
     (GOALKEEPER, 'Goalkeeper'), 
     (DEFENDER, 'Defender'), 
     (MIDFIELDER, 'Midfielder'), 
     (FORWARD, 'Forward') 
    ) 
    position = models.CharField(max_length=50, choices=POSITION, default=GOALKEEPER) 

class PlayerDetail(models.Model): 
    # Basic 
    height = models.FloatField(default=0.0) 
    weight = models.IntegerField(default=0) 

    # Relationships 
    player = models.ForeignKey(Player, related_name='player_detail') 

を:

class PlayerDetailSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = PlayerDetail 
     fields = ('weight', 'height') 


class PlayerSerializer(serializers.HyperlinkedModelSerializer): 
    player_detail = PlayerDetailSerializer(many=True) 

    class Meta: 
     model = Player 
     fields = ('id', 'first_name', 'last_name', 'position', 'player_detail') 

views.pyマイcreate方法

def create(self, request): 
     serializer = PlayerSerializer(data=request.data, many=True) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 

     return Response('Player cannot be created', status=status.HTTP_400_BAD_REQUEST) 

まあ、私はこれにJSON要求を送りますAPIを実装する。私が送ったオブジェクトは、次のとおりです。結果には

{ 
     "first_name": "Player1", 
     "last_name": "Player1", 
     "position": "DEFENDER", 
     "player_detail": { 
      "weight": 80, 
       "height": 180 
     } 
} 

私は400不正な要求とPlayer cannot be createdを参照してください。なぜそれが間違っているのか分かりません。私は私の関係が良いと定義していると思う。 JSON経由で接続オブジェクトを作成するにはどうすればよいですか?

EDIT: 今私のシリアライザは、次のようになります。

class PlayerDetailSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = PlayerDetail 
     fields = ('weight', 'height') 


class PlayerSerializer(serializers.ModelSerializer): 
    player_detail = PlayerDetailSerializer(many=True) 

    class Meta: 
     model = Player 
     fields = ('id', 'first_name', 'last_name', 'position', 'player_detail') 

    def create(self, validated_data): 
     player_detail = validated_data.pop('player_detail') 
     player = Player.objects.create(**validated_data) 
     PlayerDetail.objects.create(player=player, **player_detail) 
     return player 

が、それでも私はこのエラーを取得する: {'player_detail': {'non_field_errors': ['Expected a list of items but got type "dict".']}}

私もその後、serializer.save()が呼び出されPlayerDetailSerializermany=Trueせずにそれをしようとするが、空の列の値がplayer_detail_idreturn self.cursor.execute(sql, params) django.db.utils.IntegrityErrorが得られます。

編集2: これを解決しました。

def create(self, validated_data): 
     player_detail = PlayerDetail.objects.create(**validated_data.pop('player_detail')) 
     player = Player.objects.create(player_detail=player_detail, **validated_data) 
     return player 

を、今、ネストされたreliationshipが作成されているとオブジェクト:私はこれにシリアライザにcreate方法を変更しました。

+1

シリアライザで検証エラーが発生した場合は、serializer.errorsで何が問題なのかを確認できます。 また、ネストされたオブジェクトを正しく作成していないと感じる場合は、関連するオブジェクトを作成する方法を確認してください。[documentation](http://www.django-rest-framework.org/api- –

+0

@ DA-- serializers.errorsにエラーが発生しました: 'アイテムのリストを期待していましたが、タイプが" dict "' – allocer

答えて

1

createの方法がPlayerDetailSerializerにあるとしますか?検証されたデータを引数として受け取り、リクエストを渡していることに注意してください。

また、PlayerDetailを「手動で」ポップして、モデルインスタンスを作成する必要があります。あなたがこれをしないので、プレイヤーが検証されると、辞書は検証されたデータにあります。オブジェクトキーをPlayer.objects.createメソッドに渡します。私はそれをdocumentationよりもうまく説明できませんが、変更する必要があると思うように、ドキュメントからcreateメソッドを貼り付けていきます。

あなたの問題を誤解している場合はお知らせください。私はこの回答を編集できます。

+0

'create'メソッドがviews.pyにあります – allocer

+0

さて、シリアライザにcreateメソッドを追加するより: –

+0

私の投稿を編集しました。あなたが言った方法を追加しましたが、それは役に立たないと思います。 – allocer

関連する問題