CRUD Demo Based on Django RESTful and IntelliJ IDEA

 

Overview

最近要升级API,由之前的堆砌方法升级到RESTful(每个URL代表一种资源),使用内置的CRUD route来定位资源并操作她。

下面看看结合IDEA的Django plugin如何new一个新demo。


Version

version


QuickStart

  1. 在项目顶层新建模块

new module

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

set module

名字由demo改为rdemo

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

Django Autogen

  1. 编辑MVC
    • 修改表结构的models.py
    • 修改实现逻辑的views.py
    • 修改路由逻辑的urls.py
  2. 使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的时候却引用了,所以这里加上。

add rest_framework to INSTALLED_APPS

call succeed

Final Django Autogen

Tests

在这里运行一些测试URL,以验证CRUD。


Others

这里并不符合RESTful的:instance_id的方式,因为这里将CRUD的方法都用了list_route转换了,变成C1R1U1D1,为了更好识别吧。


RESTFUL

下面增加符合RESTful风格的另一个viewset,personrest,结果如下,

使用的是DefaultRouter,其中自动生成了CRUD方法,要注意最左侧的URL Style,以及view方法里面的具体实现,要一一对应,不然就是404或者500。

DefaultRouter

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

personrest-create

personrest-retrieve

personrest-update

personrest-retrieve2

personrest-destroy

personrest-retrieve3

URL的instance_id要拼凑,不可以缺失。


RESTful Multiple Resources

在model(表)是多个field组成一个unique key的时候,需要用到多级资源来定位。比如说定位一个人Person,需要name,phone,age(当然这里其实phone就能唯一确定一个人,但是为了说明样例,这里假设了三个field才能唯一定位某人),单单一个name是不足的。

设计如下,先找到一级资源name,然后在一级资源下的二级资源找phone,然后在二级资源下的三级资源找age,从而找到某人,再对某人进行操作。

personrest-create

personrest-retrieve

personrest-update

personrest-retrieve2

personrest-destroy

personrest-retrieve3


APIDOC

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

apidoc


Reference