python - Django REST Framework - 在创建时序列化嵌套关系

标签 python django rest frameworks nested

我有这两个基于以下模型的序列化器:

class LanguageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Language
        fields = '__all__'


class GameSerializer(serializers.ModelSerializer):
    language = LanguageSerializer()

    class Meta:
        model = Game
        fields = '__all__'


class Game(models.Model):
    language = models.ForeignKey(Language)


class Language(models.Model):
    name = models.CharField(max_length=50, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

当我尝试创建新的 Game 实体时,我将此游戏的 Language id 作为参数传递。由于某些原因,DRF 希望语言作为字典而不是整数传递。这是错误:

{
    "language": {
        "non_field_errors": [
            "Invalid data. Expected a dictionary, but got int."
        ]
    }
}

向 DRF 指示创建一个基于提供的 Language id 具有 Language 属性的 Game 的正确方法是什么?

最佳答案

创建一个不包含有关语言的所有详细信息的单独序列化程序是一种解决方案。您可以创建一个使用 PrimaryKeyRelatedField() 的单独序列化器

# I always call mine shallow to differentiate between the full serializer
class ShallowGameSerializer(serializers.ModelSerializer):
    language = serializers.PrimaryKeyRelatedField()
    class Meta:
        model = Game
        fields = '__all__'

您可以在返回/列出对象时使用普通的GameSerializer,然后在创建游戏时使用ShallowGameSerializer,这样您只需提供id即可。

关于python - Django REST Framework - 在创建时序列化嵌套关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328258/

相关文章:

python - ReportLab:大字体的文本挤在段落中

java - REST - 如何公开文件存储库项目中的文件?

javascript - 批量 REST API POST 处理

api - 经典 API key 与 REST API 凭证共存的 Paypal 可能性

python - 循环处理字符串

python - 使用网络应用程序更新已发布的 Google 电子表格?

python - 我可以使用 asyncio 读取和写入 multiprocessing.Pipe 吗?

python - Django STATIC_FILE 没有像我想的那样工作?

python - 适用于每个可变阶段的 Flask 可扩展 URL

python - 在 Django 中存储旧密码哈希值,因此用户不能重复使用相同的密码