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

Python 使用Django Rest框架序列化自定义数据类型并返回响应,python,json,django,django-rest-framework,Python,Json,Django,Django Rest Framework,关于Django Rest框架的大多数教程都解释了如何使用Django模型和执行CRUD操作。如果我使用JSON序列化程序,那么用户模型上的GET请求将以JSON格式返回用户对象的属性 我正在设计Django应用程序来处理查询和返回响应。 例如,我提供了一个RESTAPI来获取以下查询的结果 “给我用户名和工资高于XXX的部门” 以下是我的Django车型: class UserProfile(AbstractUser): age = models.PositiveIntegerFiel

关于Django Rest框架的大多数教程都解释了如何使用Django模型和执行CRUD操作。如果我使用JSON序列化程序,那么用户模型上的
GET
请求将以JSON格式返回用户对象的属性

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

“给我用户名和工资高于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(数据传输对象):

在使用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-RSAPI(jersey和RESTeasy)来实现这种序列化

这并不需要REST框架。您只需定义一个
序列化程序
类,而不是现有的
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
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')
url(r'^users/(?P<salary>\d+)$', views.getNameandDept, name='getNameandDept'),
然后在您的
视图中.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
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')
url(r'^users/(?P<salary>\d+)$', views.getNameandDept, name='getNameandDept'),
不要忘记在
url.py中定义
salary
参数

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
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')
url(r'^users/(?P<salary>\d+)$', views.getNameandDept, name='getNameandDept'),
然后序列化输出(注意稍微不同的语法)


当您提到在DRF中使用ModelSerializer时,您正在序列化整个用户对象。它序列化了模型的所有属性。但我只对这个特定GET请求的用户的某些属性感兴趣。工资、名字、部门。不是其他属性。您可以在ModelSerializer中指定所需的字段,并在必要时重命名这些字段,请参见PS。DRF的使用与使用Django内部序列化程序完全一样。。语法略有不同,代码量相同。(除了DRF有一些很好的请求类型装饰器等)是的,Django internal和DRF序列化程序都希望处理模型对象,而不仅仅是序列化某些东西的所有属性。tbh我看不出定义DTO和定义序列化程序之间有多大区别。在后一种情况下,您需要DTO和序列化程序。但是我想说的是,我可以只使用DTO和框架为我处理序列化(就像JAX-RS这样的Java框架)吗