如何将HTTP POST数据绑定到Django Rest Framework中的python对象?

时间:2015-02-04 21:12:30

标签: json django jax-rs django-rest-framework

我将举一个例子来更好地解释我的问题

我的要求:

POST

http://localhost:8080/users/

请求正文:(已发布)

{"name":"Matt", 
 "salary":10000,
 "blog_url":"www.myblog.com",
 "dept_name":"ENG"
}

class CustomRequest(object):
    def __init__(self,name,salary,blog_url,dept_name):
       self.name=name
       self.salary=10000
       self.blog_url=blog_url
       self.dept_name=dept_name

models.py

class myUser(models.Model):
     //fields -- username, salary

class myUserProfile(models.Model):
      User=models.OneToOneField(user)
      blog_url=models.URLfield()
      dept_name=models.ForeignKey(Department)



@apiview(['POST'])
def createUser(customrequest):
      myuser=user(customrequest.name, customrequest.salary)
      myuser.save()

      myuser.userprofile.blog_url(customrequest.blog_url)
      myuser.userprofile.dept_name(customrequest.dept_name)
      myuser.save()

我使用Java JAX-RS API进行了大部分REST服务。在这个框架中, POST请求主体被自动反序列化为该方法所接受的对象(在上面的示例中,它是customrequest)。开发人员可以使用POST请求中要查找的属性定义对象,然后执行业务逻辑。

现在我们正在考虑迁移到Django,我想知道Django Rest Framework是否提供了这种开箱即用的行为。如果是这样,我该怎么做? 请注意,在JAX-RS世界中,开发人员无需编写序列化程序。所需要的只是传入对象,其中传入的JSON被去除了。

我假设在Django中,需要一个序列化器和一个传输对象来实现相同的目的。

1 个答案:

答案 0 :(得分:1)

在DRF中,您有两种选择:

  • 您使用ModelSerializer并自动获取模型实例
  • 或者您使用Serializer并获得validated_data并随意执行任何操作

序列化程序与您调用的transfer object相同,因为它们都定义了数据结构,并且两者都将保存反序列化的值。

对于模型,它是持久性所必需的,但在JAX-RS中也是必需的,除非您使用与ORM实体相同的类(这是一个糟糕的设计)。因此,在JAX-RS中,您将拥有CustomRequest和JPA CustomRequestEntity