系列文章目录
提示:阅读本章之前,请先阅读目录
文章目录
- 系列文章目录
- 前言
- 1. 创建django项目
- 2. 修改settings.py
- 3. 根目录创建static文件夹
- 4. 启动项目
- 5. 创建数据表
- 6. 创建一个超级管理员
- 7. 登录django的admin后台
- 8. 安装 REST framework
- 9. 配置settings.py
- 10. 重新生成数据表
- 11. 配置urls.py路由
- 12. 访问rest framework的登录
- 13. 创建course app
- 14. 配置course的apps.py
- 15. 编写course的models.py
- 16. 编写course的admin.py
- 17. 把course加入app
- 18. 创建数据表
- 19. 编写serializers.py
- 20. Django 原生的FBV和CBV编写接口
前言
1. 创建django项目
django-admin startproject 项目名称
2. 修改settings.py
修改
ALLOWED_HOSTS = ["*"] LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_TZ = False DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_test','USER': 'root','PASSWORD': '123456','HOST': 'localhost','PORT': 3308}}
新增
STATIC_ROOT = os.path.join(BASE_DIR, "static")STATICFIELS_DIRS = [os.path.join(BASE_DIR, "staticfiles")]
3. 根目录创建static文件夹
4. 启动项目
python manage.py runserver
http://127.0.0.1:8000/
5. 创建数据表
python .\manage.py makemigrations python .\manage.py migrate
6. 创建一个超级管理员
python .\manage.py createsuperuser用户名 (leave blank to use 'xxxx'): smobee电子邮件地址: xxxx@qq.comPassword:Password (again):密码长度太短。密码必须包含至少 8 个字符。这个密码太常见了。密码只包含数字。Bypass password validation and create user anyway? [y/N]: ySuperuser created successfully.
7. 登录django的admin后台
http://127.0.0.1:8000/admin
8. 安装 REST framework
依赖requirements.txt
asgiref==3.2.7certifi==2020.4.5.1chardet==3.0.4coreapi==2.3.3coreschema==0.0.4Django==3.0.6django-filter==2.2.0djangorestframework==3.11.0idna==2.9importlib-metadata==1.6.0itypes==1.2.0Jinja2==2.11.2Markdown==3.2.2MarkupSafe==1.1.1Pygments==2.6.1pytz==2020.1requests==2.23.0sqlparse==0.3.1uritemplate==3.0.1urllib3==1.25.9zipp==3.1.0
官网
https://www.django-rest-framework.org/#installation
pip install djangorestframeworkpip install markdown # Markdown support for the browsable API.pip install django-filter # Filtering support
9. 配置settings.py
INSTALLED_APPS = [...'rest_framework','rest_framework.authtoken',] REST_FRAMEWORK = {# 分页器'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',# 分页'PAGE_SIZE': 50,# 返回的时间格式'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',# 返回的数据格式'DEFAULT_RENDER_CLASSES': ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],# 解析request.data'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser',],# 全局权限'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated'],# 认证方式'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.BasicAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.TokenAuthentication',]}
10. 重新生成数据表
python .\manage.py makemigrations
python .\manage.py migrate
11. 配置urls.py路由
from django.contrib import adminfrom django.urls import path, includeurlpatterns = [path('api-auth/', include('rest_framework.urls')),path('admin/', admin.site.urls),]
12. 访问rest framework的登录
http://127.0.0.1:8000/api-auth/login/
13. 创建course app
python .\manage.py startapp course
14. 配置course的apps.py
class CourseConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'course'verbose_name = '课程信息'
15. 编写course的models.py
from django.conf import settingsfrom django.db import modelsclass Course(models.Model):name = models.CharField(max_length=255, unique=True, help_text='课程名称', verbose_name='课程名称')introduction = models.TextField(help_text='课程介绍', verbose_name='课程介绍')price = models.DecimalField(max_digits=10, decimal_places=2, help_text='课程价格', verbose_name='课程价格')teacher = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, help_text='课程讲师',verbose_name='课程讲师')create_at = models.DateTimeField(auto_now_add=True, help_text='创建时间', verbose_name='创建时间')update_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')class Meta:verbose_name = '课程信息'verbose_name_plural = '课程信息'ordering = ('price',)def __str__(self):return self.name
16. 编写course的admin.py
from django.contrib import adminfrom .models import Course@admin.register(Course)class CourseAdmin(admin.ModelAdmin):# 显示哪些字段list_display = ('name', 'introduction', 'teacher', 'price', 'create_at')# 搜索字段search_fields = list_display# 筛选字段list_filter = list_display
17. 把course加入app
settings.py
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework','rest_framework.authtoken','course']
18. 创建数据表
python .\manage.py makemigrations
python .\manage.py migrate
19. 编写serializers.py
#!/usr/bin/env python# -*- coding: UTF-8 -*-# Author : zhongshaofeng# File : serializers.py# Time : 2023/6/30 0:06from django.contrib.auth.models import Userfrom .models import Coursefrom rest_framework import serializersclass UserSerializer(serializers.ModelSerializer):class Meta:model = User# 序列号所有字段,如果要序列化某些字段,写成元祖即可,('id', 'name', )fields = '__all__'class CourseSerializer(serializers.ModelSerializer):# 引入外键teacher = serializers.ReadOnlyField(source='teacher.username')class Meta:model = Coursefields = '__all__'# 设置深度depth = 2# 带超链接的# class CourseSerializer(serializers.HyperlinkedModelSerializer):# # 引入外键# teacher = serializers.ReadOnlyField(source='teacher.username')## class Meta:# model = Course# fields = '__all__'
20. Django 原生的FBV和CBV编写接口
import jsonfrom django.shortcuts import renderfrom django.http import HttpRequest, JsonResponse, HttpResponsefrom django.utils.decorators import method_decoratorfrom django.views import Viewfrom django.views.decorators.csrf import csrf_exemptfrom .models import Coursecourse_dict = {'name': '数学','introduction': '这是一门数学哦','price': 256.01}@csrf_exemptdef course_list(request: HttpRequest):"""Django FBV 原生接口:param request::return:"""if request.method == 'GET':# 查询所有课程courses = Course.objects.all()# 等同于这种返回# return HttpResponse(json.dumps(courses), content_type='application/json')return JsonResponse(courses)if request.method == 'POST':# post的话,需要引入取消csrf认证# 序列化course = json.loads(request.body.decode('utf-8'))# return HttpResponse(json.dumps(course), content_type='application/json')return JsonResponse(course, safe=False)# 这里的name='dispatch',是因为django路由进来时,先走的dispatch@method_decorator(csrf_exempt, name='dispatch')class CourseList(View):"""Django 的 CBV 编写接口"""def get(self, request: HttpRequest):return JsonResponse(course_dict)def post(self, request: HttpRequest):course = json.loads(request.body.decode('utf-8'))return HttpResponse(json.dumps(course), content_type='application/json')