【问题标题】:Django rest serializer.data is an empty OrderedDict()Django rest serializer.data 是一个空的 OrderedDict()
【发布时间】:2015-06-10 00:19:01
【问题描述】:

这是我的模型:

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime


class Staff(models.Model):
    employer = models.ForeignKey("shops.Shop")
    user = models.ForeignKey(User)

    def __unicode__(self):
        return self.user.username

这是我的序列化器:

from rest_framework import serializers
from staff.models import Staff 


class StaffSerializer(serializers.Serializer):
    class Meta:
        model = Staff
        fields = ("id", "employer", "user")

这是我的看法:

from staff.models import Staff
from staff.serializers import StaffSerializer
from rest_framework import  generics
from rest_framework.response import Response



class StaffList(generics.ListCreateAPIView):
    queryset = Staff.objects.all()
    serializer_class = StaffSerializer

    def list(self, request):
        queryset = self.get_queryset()
        serializer = StaffSerializer(queryset, many=True)
        print queryset
        print serializer
        print serializer.data
        return Response(serializer.data)

在网络可浏览 API 上查看此页面时,我看到的是:

HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, POST, HEAD, OPTIONS

[
    {}
]

打印 serializer.data 和 queryset 的结果是这样的:

{<Staff: Alex>}
StaffSerializer([<Staff: Alex>], many=True):
[OrderedDict()]

我的序列化程序有什么问题吗?或者这是另一个问题?

【问题讨论】:

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


    【解决方案1】:

    如果您使用模型和查询集,则需要使用 serializers.ModelSerializer 而不是 serializers.Serializer

    如果您使用的是 serializers.Serializer,您需要在其中手动定义字段。像这样:

    class StaffSerializer(serializers.Serializer):
      id = serializers.IntegerField()
      content = serializers.CharField(max_length=200)
    

    等等。 您不能像使用 ModelSerializer 那样在元中引用它们。关于 ModelSerializer 的文档可以在here找到。

    【讨论】:

    • 当我使用serializers.Serializer 时会发生这种情况。你有什么线索吗?
    • 这已经很晚了,但是在我的实例中覆盖 serializers.ModelSerializer.__init__ 时我遇到了同样的问题。即使 init 只做一个 super() 备份链。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多