でモデルを作成することはできません私は、関連するモデルのコード作成:、私はすべてのモデルのためのシリアライザを行っている次にジャンゴ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()
が呼び出されPlayerDetailSerializer
にmany=True
せずにそれをしようとするが、空の列の値がplayer_detail_id
のreturn 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
方法を変更しました。
シリアライザで検証エラーが発生した場合は、serializer.errorsで何が問題なのかを確認できます。 また、ネストされたオブジェクトを正しく作成していないと感じる場合は、関連するオブジェクトを作成する方法を確認してください。[documentation](http://www.django-rest-framework.org/api- –
@ DA-- serializers.errorsにエラーが発生しました: 'アイテムのリストを期待していましたが、タイプが" dict "' – allocer