大多数关于 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)。
最佳答案
您实际上并不需要 REST Framework。您只需要定义一个 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')
不要忘记在 urls.py
中定义 salary
参数
url(r'^users/(?P<salary>\d+)$', views.getNameandDept, name='getNameandDept'),
附言。您也绝对可以使用 DRF 做到这一点。这是一个基本的 GET
调用(按工资过滤对序列化程序没有影响),因此您需要做的就是定义一个仅包含三个字段的 ModelSerializer
子类
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name', 'salary', 'dept_name')
然后序列化输出(注意语法略有不同)
serializer = UserSerializer(users)
return Response(serializer.data)
关于python - 使用 Django Rest 框架序列化自定义数据类型并返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28314173/