记录一下django restful配合IDEA插件的安装和测试步骤,目录如下,
0. Overview
1. Version
2. QuickStart
- 在项目顶层新建模块
- 设置新模块,勾选Django,填入app名
- 自动生成代码
- 编辑MVC
- 使MVC改动作用到数据库文件
3. Tests
- create
- retrieve
- update
- destroy
4. Others
5. RESTful
6. RESTful Multiple Resources
7. APIDOC
8. Reference
Overview
最近要升级API,由之前的堆砌方法升级到RESTful(每个URL代表一种资源),使用内置的CRUD route来定位资源并操作她。
下面看看结合IDEA的Django plugin如何new一个新demo。
Version

QuickStart
- 在项目顶层新建模块

- 设置新模块,勾选Django,填入app名

名字由demo改为rdemo
- 自动生成代码
这里一开始顶层文件夹名字是restful-crud
,由于带-
导致代码不能自动生成,所以最后改为restfulcrud
。

-
编辑MVC
- 修改表结构的
models.py
- 修改实现逻辑的
views.py
- 修改路由逻辑的
urls.py
- 修改表结构的
-
使MVC改动作用到数据库文件
- cd rdemo/
- python manage.py makemigrations (产生migrations文件,如下,但是并未作用到数据库文件)
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import django.core.validators
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='Person',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('created_by', models.CharField(default=b'', max_length=128)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_by', models.CharField(default=b'', max_length=128)),
('updated_at', models.DateTimeField(auto_now=True)),
('description', models.TextField(default=b'')),
('name', models.CharField(max_length=20)),
('phone', models.CharField(max_length=11, verbose_name=b'phone Number', validators=[django.core.validators.MinLengthValidator(11)])),
('age', models.IntegerField()),
('address', models.TextField()),
],
options={
'db_table': 'person',
},
),
migrations.AlterUniqueTogether(
name='person',
unique_together=set([('name', 'phone')]),
),
]
- python manage.py migrate (将改动作用到数据库文件,比如产生table之类)
- python manage.py runserver localhost:8000

是由于Django settings里面没有引入rest_framework
,而该项目这里的MVC的时候却引用了,所以这里加上。



Tests
在这里运行一些测试URL,以验证CRUD。
Others
这里并不符合RESTful的:instance_id
的方式,因为这里将CRUD的方法都用了list_route转换了,变成C1R1U1D1,为了更好识别吧。
RESTFUL
下面增加符合RESTful风格的另一个viewset,personrest,结果如下,
使用的是DefaultRouter,其中自动生成了CRUD方法,要注意最左侧的URL Style,以及view方法里面的具体实现,要一一对应,不然就是404或者500。

- with instance_id, (CREATE)
- without instance_id, (RETRIEVE, UPDATE, DESTROY)






URL的instance_id要拼凑,不可以缺失。
RESTful Multiple Resources
在model(表)是多个field组成一个unique key的时候,需要用到多级资源来定位。比如说定位一个人Person,需要name,phone,age(当然这里其实phone就能唯一确定一个人,但是为了说明样例,这里假设了三个field才能唯一定位某人),单单一个name是不足的。
设计如下,先找到一级资源name,然后在一级资源下的二级资源找phone,然后在二级资源下的三级资源找age,从而找到某人,再对某人进行操作。






APIDOC
通过在每一个RESTful CRUD方法下面加上注释,然后通过apidocjs来生成index.html等静态文件,用于生成网页,如下,

网友评论