【问题标题】:Return nested json response返回嵌套的 json 响应
【发布时间】:2017-03-15 11:51:07
【问题描述】:

我的models.py:

class CUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), max_length=254, unique=True)
    first_name = models.CharField(_('first name'), max_length=30)
    last_updated = models.DateTimeField(_('last updated'), default=timezone.now)

class SL(models.Model):
    name = models.CharField(max_length=32)
    last_updated = models.DateTimeField(default=timezone.now)
    uuid = models.UUIDField(primary_key=True)

class Key(models.Model):
    last_updated = models.DateTimeField(default=timezone.now)
    name = models.CharField(max_length=32, default = 'Unnamed')
    sl_uuid = models.ForeignKey(SL, related_name='ssls')
    user = models.ForeignKey(CUser)

urls.py:

urlpatterns = [
    url(r'^getstate/$', views.GetStateView.as_view(), name='getstate'),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

serializers.py:

class SLSerializer(serializers.Serializer):
    queryset=SL.objects.all()
    class Meta:
        model = SL
        fields = (
            'name',
            'uuid',
            'last_updated',
        )

class GetStateSerializer(serializers.ModelSerializer):
    sls = SLSerializer(many=True)

    class Meta:
        model = User
        fields = tuple(User.REQUIRED_FIELDS) + (
            User.USERNAME_FIELD,
            'last_updated',
            'sls',
        )
        read_only_fields = (
            User.USERNAME_FIELD,
        )

views.py:

class GetStateView(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = serializers.GetStateSerializer
    permission_classes = (
        permissions.IsAuthenticated,
    )

    def get_object(self, *args, **kwargs):
        return self.request.user

我想得到 json 响应:

{
    "email":"abc.com",
    "first_name":"abc",
    "last_updated":"2016-11-02T02:12:36Z",
    "sls": [
         {
            "name":"123",
            "last_updated":"2016-11-02T02:12:36Z",
            "uuid":"ac9d496d-62ba-45a1-a1ec-e1eca571b656"
         },
         {
            "name":"23",
            "last_updated":"2016-11-02T02:12:36Z",
            "uuid":"ac9d496d-62ba-45a1-a1ec-e1eca571b656"
         }
    ]
}

我将 SL 条目设为空:

{
  "first_name": "Monica",
  "email": "abc@abc.com",
  "last_updated": "2016-11-02T02:12:46Z",
  "sls": [
    {},
    {}
  ]
}

它使用令牌身份验证,并将使用key 表为请求用户(我正在使用 self.request.user)选择所有 SL,并将发送用户详细信息以及 SL 条目。 但我不知道该怎么做。

【问题讨论】:

  • @Sayse 这不是上述问题的重复。黑白表的关系完全不同。我很难根据关系序列化数据。所以我会要求你再看看这个问题。我是框架的初学者,所以我很难解决这个问题。
  • 但是您的视图从不调用任何序列化程序。它永远不会返回任何类型的模型数据。
  • @DanielRoseman 我已经指定了 serializer_class serializer_class= serializers.GetStateSerializer。不是这样吗?
  • 嗯,通常情况下,但是您已经覆盖了get,这通常称为序列化程序。所以你需要自己调用它。 (请注意,正是由于这个原因,覆盖 getpost 通常是个坏主意。)

标签: python django api serialization django-rest-framework


【解决方案1】:

更新您的序列化程序,如下所示

class SLSerializer(serializers.ModelSerializer):
    class Meta:
        model = SL
        fields = (
            'name',
            'uuid',
            'last_updated',
        )

class GetStateSerializer(serializers.ModelSerializer):
    sls = SLSerializer(queryset=SL.objects.all(), many=True)

    class Meta:
        model = User
        fields = tuple(User.REQUIRED_FIELDS) + (
            User.USERNAME_FIELD,
            'last_updated',
            'sls',
        )
        read_only_fields = (
            User.USERNAME_FIELD,
        )

【讨论】:

    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2020-12-31
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    相关资源
    最近更新 更多