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

标签 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)。

最佳答案

您实际上并不需要 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/

相关文章:

python - FMU 模块和方法 get_author()

python - 如何使用 Discord py 检查 Minecraft 服务器是否在线并获取统计信息(如在线玩家数量)

Python Gtk3 在textview中设置文本

java - 在 Android 中使用 Json

java - JSON 错误 "java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $"

python - tensorflow 范围名称的限制是什么?

php - 如何通过ajax调用获取wp_usermeta中的meta_key及其meta_value(json格式)

django - “NoneType”对象没有属性 'save' Django

django - Django 中的 M2M 关系验证

python - 如何在Python中获取类路径