1.新建Djngo项目
django-admin startproject drf_demo
2.添加依赖
利用pip来添加需要的REST framework的依赖
pip install djangorestframework
3.在settings.py的INSTALLED_APPS中添加’rest_framework’。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework'
]
4.修改数据库配置
配置本地数据库
- 连接数据库
mysql -u用户名 -p密码
- 新建数据库
create database 数据库名称
修改setting.py中的DATABASES配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'drf_demo', # 数据库名
'USER': 'root', # 账号
'PASSWORD': '123456', # 密码
'HOST': '127.0.0.1', # HOST
'POST': 3306, # 端口
}
}
setting中的配置默认为sqlite3数据库 当需要修改成MySql时,需要在setting.py的同级目录的__init__.py 加入如下配置,否则会报错: Error loading MySQLdb module.
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
5. 新建模型
进入项目,执行语句 python manage.py startapp student
,打开student/models.py文件,创建模型
class Student(models.Model):
name = models.CharField(u'姓名', max_length=100, default='no_name')
sex = models.CharField(u'性别',max_length=50,default='male')
sid = models.IntegerField(u'学号',default='0')
def __unicode__(self):
return '%d: %s' % (self.pk, self.name)
在settings.py的INSTALLED_APPS中注册。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'student'
]
执行数据库同步和迁移命令,自动建立数据表
python manage.py makemigrations
python manage.py migrate
6. 编写api
序列化
在student下面新建serializers.py,代码内容为:
from rest_framework import serializers
from .models import Student
class StudentSerializers(serializers.ModelSerializer):
class Meta:
model = Student # 指定的模型类
fields = '__all__' # 需要序列化的属性
在同目录下views.py中编写视图
from rest_framework import viewsets
from .models import Student
from rest_framework import status
from rest_framework.response import Response
from .serializers import StudentSerializers
# Create your views here.
class StudentViewSet(viewsets.ModelViewSet):
# 指定结果集并设置排序
queryset = Student.objects.all().order_by('-pk')
# 指定序列化的类
serializer_class = StudentSerializers
def get(self, request):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def post(self, request):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def get_retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
def put(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def delete(self, request, pk):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
instance.delete()
设置路由
from django.contrib import admin
from django.urls import path
from student.views import StudentViewSet
urlpatterns = [
path('admin/', admin.site.urls),
path('student/', StudentViewSet.as_view({'get': 'get', 'post': 'post'})),
path('student/<pk>',StudentViewSet.as_view({'get': 'get_retrieve','put':'put','delete':'delete'}))
]
7.浏览器API测试
启动项目。在控制台输入命令
python manage.py runserver
出现下图则启动成功
访问http://127.0.0.1:8000/student/
出现下图代表成功
其他
自定义表名
class GroupMember(models.Model):
Group = models.ForeignKey(to=Group,help_text='组织',on_delete=models.CASCADE)
GroupMember = models.ForeignKey(to=User, help_text='组织成员',on_delete=models.CASCADE)
# 通过db_table自定义数据表名
class Meta:
db_table = 'tb_groupMember'