首页 > 解决方案 > 基于主键的对象序列化和反序列化

问题描述

我有几个相关的对象,比如用户和位置。用户和位置具有一对一的关系

class Location(models.Model):
    name = models.CharField(max_length=100)


class CustomUser(AbstractUser):
    first_name = models.CharField(null=True, max_length=500)
    last_name = models.CharField(null=True, max_length=500)
    location = models.ForeignKey(Location, null=True, on_delete=models.CASCADE)

在使用django rest 框架时,对用户的 get 请求将返回类似

{
  "id": 123,
  "first_name": "first_name",
  "last_name": "last_name",
  "location": 34
}

我想得到类似的回应,

{
  "id": 123,
  "first_name": "first_name",
  "last_name": "last_name",
  "location": {
    "id": 34,
    "name": "No Man's Land"
  }
}

嵌套序列化程序和 PrimaryKeyRelatedField 可以工作,但并非在所有情况下都有效。有没有办法做到这一点?

标签: djangorestdjango-rest-frameworkdeserialization

解决方案


实现所需结果的正常方法是使用嵌套序列化程序。那就是为您的嵌套位编写一个序列化程序,然后将其用作父序列化程序中的一个字段。像这样的东西:

class LocationSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(max_length=100)

class UserSerializer(serializers.Serializer):
    first_name = serializers.CharField(null=True, max_length=500)
    last_name = serializers.CharField(null=True, max_length=500)
    location = LocationSerializer()

推荐阅读