处理TastyPie和Django API的请求数据

时间:2017-08-30 07:16:31

标签: python django tastypie

我正在使用django-tastypie编写应用程序,以下是我的models.py和resource.py文件。

Models.py:

import uuid

from django.db import models


class User(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50, null=False)
    email = models.EmailField(max_length=254, null=False)
    password = models.CharField(max_length=100, null=False)
    role = models.CharField(max_length=16, default='basic', null=False)

    def __unicode__(self):
        return self.name, self.email

Resources.py:

from tastypie.resources import ModelResource
from tastypie.authorization import Authorization

from api.models import User


class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'
        authorization = Authorization()
        excludes = ['password']
        #allowed_methods = ['get']

现在的问题是,每当我从邮递员点击API终点时,就会直接创建用户。现在我不明白的是请求数据是进入资源然后进入数据库还是直接进入数据库?实际上,我需要在数据存储到数据库之前对数据进行一些更改,例如散列密码然后将对象存储在数据库中。我是django的新手,我怎么能实现这个目标呢? 就像在Flask中一样,我们可以做类似的事情:

@user.route('/users', methods=['POST'])
def create_user(user_id):

    data = request.get_json(force=True)

    # do all the changes we want

    user = User(data)
    db.session.add(user)
    db.session.commit()

现在,如果有任何请求来自' / users'终点,我们可以在“数据”中获取数据。变量,然后在存储到数据库之前我们想要的任何变化。但是如何用dastypie在django中做到这一点。

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

如果您在进入database之前必须按摩数据,那么Tastypie具有hydratedehydrate方法的概念。

检查一下。这是参考hydrate and dehydrate

答案 1 :(得分:0)

在每个Web框架中,随请求一起发送的数据通过某种机制传递给api端点,并且在Tastypie中也会发生相同的事情(您可以在Flow Through The Request/Response Cycle下的Tastypie文档中阅读它。)

如果您想更改发送/接收的数据,请阅读Hydrate/Dehydrate,在您的情况下,您希望对用户密码使用脱水,但我建议您节省工作量,而是通过继承使用自定义用户模型从AbstractUser开始,默认情况下,当用户对象保存到数据库时,您可以获得哈希密码。