Python Django REST-无法创建具有关系的模型

Python Django REST-无法创建具有关系的模型,python,django,rest,relationship,serialization,Python,Django,Rest,Relationship,Serialization,我为我的相关模型创建了一个代码: 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 = 'MIDFIELDE

我为我的相关模型创建了一个代码:

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)
我向这个简单的API发送了一个JSON请求。我发送的对象是:

 {
        "first_name": "Player1",
        "last_name": "Player1",
        "position": "DEFENDER",
        "player_detail": {
             "weight": 80,
              "height": 180
        }
}
结果我只看到400个错误请求,无法创建
播放器
。我不知道为什么是错的。我觉得我的关系很好。 通过JSON创建连接对象的好方法是什么

编辑: 现在,我的序列化程序看起来像:

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':['需要一个项目列表,但得到类型“dict”。]}

我也尝试在
PlayerDetailSerializer
中不使用
many=True
的情况下执行,然后调用
serializer.save()
,但我得到一个
返回self.cursor.execute(sql,params)django.db.utils.integrityyror
,在
player\u detail\u id
中使用空列值

编辑2: 我已经解决了这个问题。我已将序列化程序中的
create
方法更改为:

  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

现在,已经创建了具有嵌套可靠性的对象。

我假设您的
创建方法在
PlayerDetailSerializer
中?请注意,它将已验证的数据作为参数,您正在传递请求

此外,您还必须“手动”弹出
PlayerDetail
,并创建模型实例。因为您没有这样做,所以在验证播放机时,dict在已验证的数据中。然后将对象键传递给
Player.objects.create
方法。我无法对其进行更好的解释,但我将从文档中粘贴
create
方法,因为我认为这是您必须更改的内容

def create(self, validated_data):
    tracks_data = validated_data.pop('tracks')
    album = Album.objects.create(**validated_data)
    for track_data in tracks_data:
        Track.objects.create(album=album, **track_data)
    return album

如果我误解了你的问题,请告诉我,这样我可以编辑这个答案

如果是序列化程序中的验证错误,您将在serializer.errors中找到错误。另外,请查看如何创建相关对象,如果您感觉没有正确创建嵌套对象,请阅读此处:@DA--I在序列化程序中出错。错误:
需要一个项目列表,但在视图中得到了类型“dict”
create
方法。pyWell,然后将create方法添加到序列化程序:)我编辑了我的文章。我添加了你们说的方法,但我认为它没有帮助。最后,我解决了这个问题。我需要在序列化程序中的
create
方法中更改一些代码。谢谢你的帮助。这对我来说不起作用,无论我在“曲目”中发送什么,我都会收到[]