【问题标题】:DRF nested json unable get user detailDRF嵌套json无法获取用户详细信息
【发布时间】:2019-11-21 18:47:32
【问题描述】:

我正在使用 django rest 框架,并且正在构建组织和用户详细信息功能。我的模型、序列化器和模型视图集细节是这样的。

class OrganizationLatest(models.Model):
    name = models.CharField(max_length=500, blank=True, null=True)
    address = models.CharField(max_length=500, blank=True, null=True)
    user = models.ForeignKey(User, default="", null=True, blank=True)
    createdat = models.DateTimeField()
    updatedat = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'organization'

组织和用户的序列化器如下

class organizationLatestSerializer(serializers.ModelSerializer):

    class Meta:
        model=OrganizationLatest
        fields =('name','address','user')

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('pk','username',)
        read_only_fields = ['id','username']

class OrganizationLatestVieset(viewsets.ModelViewSet):
       queryset = OrganizationLatest.objects.all()  # dummy objec
       serializer_class = organizationLatestSerializer

Rest api 返回

[
    {
        "name": "Org1",
        "address": null,
        "user": 7
    },
    {
        "name": "Org2",
        "address": null,
        "user": 3
    },

]

但我想要这种格式的 JSON,

[
  {
    "name": "Org1",
    "address": "xxxxx",
    "user": [
      {
        "username": "jhon",
        "email": "a@g.com"
      }
    ]
  },
  {
    "name": "Org2",
    "address": "998,abc",
    "user": [
      {
        "username": "jhon",
        "email": "a@g.com"
      }
    ]
  }      
]

请告诉我如何实现预期的 json 格式。

谢谢大家,

【问题讨论】:

  • OrganizationLatest 与 User 有 1-M 的关系,因此 OrganizationLatest 的实例显然不会有用户列表,只有一个用户实例附加到它,所以您预期的 json 已经包含问题。 user 字段值应该是 json 响应中的对象,而不是数组。

标签: python-2.7 django-models django-rest-framework


【解决方案1】:

假设 OrganizationLatest 模型如您所定义的那样,下面的代码 sn-p 将提供您所需的 JSON,但 user 字段将是一个对象,或者您可以将链接用户的用户详细信息说给 @ 987654322@实例。


class OrganizationUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username','email',)
        read_only_fields = ['id','username']

class OrganizationLatestSerializer(serializers.ModelSerializer):
    user = OrganizationUserSerializer()
    class Meta:
        model=OrganizationLatest
        fields =('name','address','user')

class OrganizationLatestVieset(viewsets.ModelViewSet):
       queryset = OrganizationLatest.objects.all() 
       serializer_class = organizationLatestSerializer

现在,您将在列表端点上获得输出 json,如下所示:-

[
  {
    "name": "Org1",
    "address": "xxxxx",
    "user": {
      "username": "jhon",
      "email": "a@g.com"
    }
  },
  {
    "name": "Org2",
    "address": "998,abc",
    "user": {
      "username": "jhon",
      "email": "a@g.com"
    }
  }
]

注意我不建议您更改UserSerializer 并使用它来代替OrganizationUserSerializer,以在OrganizationLatestSerializer 中显示用户

【讨论】:

  • 我必须对模型、序列化器和视图集进行哪些更改才能获得设计结果?
猜你喜欢
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多