Django嵌套序列化程序错误:“0”;序列化程序字段的名称可能不正确,并且与任何属性或键都不匹配;
我试图得到一个类似以下内容的json:Django嵌套序列化程序错误:“0”;序列化程序字段的名称可能不正确,并且与任何属性或键都不匹配;,django,django-rest-framework,Django,Django Rest Framework,我试图得到一个类似以下内容的json: { name: Barry Bonds, playerListing: { best_buy_price: 69,420 } } 这是serializer.py class PlayerListingForProfileSerializer(serializers.ModelSerializer): class Meta: model = PlayerListing fields =
{
name: Barry Bonds,
playerListing: {
best_buy_price: 69,420
}
}
这是serializer.py
class PlayerListingForProfileSerializer(serializers.ModelSerializer):
class Meta:
model = PlayerListing
fields = (
'best_buy_price',
)
class PlayerProfileSerializer(serializers.ModelSerializer):
PlayerListingField = PlayerListingForProfileSerializer()
class Meta:
model = PlayerProfile
fields = (
'PlayerListingField',
'card_id',
'name',
)
以下是model.py:
class PlayerProfile(models.Model):
card_id = models.CharField(max_length=120, unique=True, primary_key=True)
name = models.CharField(max_length=120, null=True)
class PlayerListing(models.Model):
player_profile = models.OneToOneField(
PlayerProfile,
on_delete=models.CASCADE,
#db_constraint=False
null=True)
name = models.CharField(max_length=120, null=True)
best_buy_price = models.IntegerField(null=True)
我以前有过这样的工作,但我不明白为什么这次它会抛出错误
Got AttributeError when attempting to get a value for field `PlayerListingField` on serializer `PlayerProfileSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `PlayerProfile` instance.
Original exception text was: 'PlayerProfile' object has no attribute 'PlayerListingField'.
删除“字段”,将其命名为与相关名称完全相同的名称
您有PlayerListing.player\u profile
和PlayerProfile.player\u列表
,因此序列化程序字段的名称应如下所示
这是经过编辑的
class PlayerProfileSerializer(serializers.ModelSerializer):
playerlisting = PlayerListingForProfileSerializer()
class Meta:
model = PlayerProfile
fields = (
'playerlisting ', # don't forget
'card_id',
'name',
)
您可以在PlayerProfileSerializer内将“source”参数传递给PlayerListingForProfileSerializer,如下所示:
PlayerListingField = PlayerListingForProfileSerializer(source="playerlisting")
有关更多信息,请查看官方django文档中的示例:
(参见“p1.餐厅”示例)谢谢!我试过了,但现在的错误是:“试图获取序列化程序
PlayerProfileSerializer
上的字段player\u列表
的值时,获取了AttributeError。”。序列化程序字段的名称可能不正确,并且与PlayerProfile
实例上的任何属性或键都不匹配。最初的异常文本是:“PlayerProfile”对象没有属性“player\u listing”。“这不起作用,因为PlayerListing.player\u配置文件(OneToOneField)没有自定义的相关\u名称,例如“player\u listing”默认情况下,它只能通过目标模型的小写名称访问,而不使用下划线分隔符。示例用法:player\u listing\u实例。playerprofile@KutayAslan-谢谢!将player_列表更改为playerlisting成功了@库塔亚斯兰说得完全正确,播放器列表
被称为相关名称,默认名称为model\u name.lower()
。如果您想更改它,在模型字段中(您通常在其中添加null、空白,…)添加related\u name=“player\u listing”
我做了更改,但仍然收到此错误;试图获取序列化程序PlayerProfileSerializer
上的字段PlayerListingField
的值时,获取了AttributeError。序列化程序字段的名称可能不正确,并且与PlayerProfile
实例上的任何属性或键都不匹配。最初的例外文本是:“PlayerProfile”对象没有“PlayerProfile”属性。啊,我的错误,这将是playerlisting不是PlayerProfile(编辑了答案)@JeremyE