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
方法中更改一些代码。谢谢你的帮助。这对我来说不起作用,无论我在“曲目”中发送什么,我都会收到[]