使用Django Rest框架来序列化自定义数据类型并返回响应

时间:2015-02-04 05:34:21

标签: python json django django-rest-framework

Django Rest Framework上的大多数教程都解释了如何使用Django模型并进行CRUD操作。如果我使用JSON序列化程序,则用户模型上的GET请求将以JSON格式返回用户对象的属性。

我正在设计我的Django应用程序来处理查询并返回响应。 例如,我提供了一个REST API来获取以下查询的结果

“获取用户的名字和部门,其薪水超过XXX”

以下是我的Django模型:

class UserProfile(AbstractUser):
    age = models.PositiveIntegerField(_("age"))
    salary=models.PositiveIntegerField(_("salary"))

AUTH_USER_MODEL = "profiles.UserProfile"
User = get_user_model()

class Department(models.Model):
      users=models.ForeignKey(User)
      dept_name = models.CharField(max_length=30)

现在我有以下DTO(数据传输对象):

class CustomResponse(object):

def __init__(self, user_name, salary, dept_name):
      self.user_name = user_name
      self.salary = salary
      self.dept_name=dept_name

在使用DRF实现的REST服务中,我想要以下

@api_view(['GET'])
def getNameandDept(salary):
    users=User.objects.filter(salary__gt=salary)
    toreturn=[]
    for user in users:
        response=CustomResponse(user.first_name,user.salary,user.dept_name)
        to_return.append(response)
    return Response(to_return)

我不确定使用Django rest框架提供的工具实现上述的正确方法是什么。

我期待这样的反应

[{user_name:"matt", salary:"5000", dept_name:"ENG"},{user_name:"smith",salary:"4000", dept_name:"HR"}....]

由于

修改

我希望DRF为这种序列化提供开箱即用的工具。我一直在使用JAX-RS API(jersey和RESTeasy)执行此序列化。

1 个答案:

答案 0 :(得分:9)

您实际上并不需要REST框架。您所需要的只是定义serializer类,而不是您拥有的CustomResponse

serializers.py

中的

from django.core.serializers.json import Serializer

class UserSerializer(Serializer):
    def get_dump_object(self, obj):
        mapped_object = {
            'user_name': obj.first_name,
            'salary': obj.salary,
            'dept_name': obj.dept_name
        }

        return mapped_object

然后在views.py

from myapp.serializers import UserSerializer

def getNameandDept(request, salary):
    users = User.objects.filter(salary__gt=salary)
    serializer = UserSerializer()
    return HttpResponse(serializer.serialize(users), mimetype='application/json')

不要忘记在salary

中定义urls.py参数
url(r'^users/(?P<salary>\d+)$', views.getNameandDept, name='getNameandDept'),

PS。你绝对可以用DRF做到这一点。这是一个基本的GET调用(按工资过滤对序列化程序没有影响),所以你需要做的只是用三个字段定义一个ModelSerializer子类

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'salary', 'dept_name')

然后序列化输出(注意略有不同的语法)

serializer = UserSerializer(users)
return Response(serializer.data)