我有这两个基于以下模型的序列化器:
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/