Django嵌套序列化程序错误:“0”;序列化程序字段的名称可能不正确,并且与任何属性或键都不匹配;

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 =

我试图得到一个类似以下内容的json:

{
   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