Python 使用Django Rest框架序列化自定义数据类型并返回响应
关于Django Rest框架的大多数教程都解释了如何使用Django模型和执行CRUD操作。如果我使用JSON序列化程序,那么用户模型上的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
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框架)吗