网站主题设计特色公司免费取名
首
Django中的模型对应数据库中的一张表格。
定义模型
player.py
from django.db import modelsclass Player(models.Model):idx = models.IntegerField(unique=True)def __str__(self):return str(self.id)
 
每个模型需要继承models类,如上Player模型定义了一个整形字段idx。常见字段类型有:
|   字段  | 描述 | 
| IntegerField | 整形 | 
| FloatField | 浮点型 | 
| CharField | 字符串类型 | 
|   TextField  | 长文本类型 | 
| BooleanField | 布尔类型 | 
每个字段可定义参数:
| 参数 | 取值 | 描述 | 
| null | True/False | 是否为空 | 
| unique | True/False | 字段是否唯一 | 
| default | auto | 字段默认值 | 
| max_length | int | 字段最大长度 | 
| primary_key | True/False | 是否为主键 | 
迁移数据
定义好模型后,需要进行迁移才能在数据库中看到表格:
python manage.py makemigrations // 生成迁移文件
python manage.py migrate // 执行迁移 
后台管理
Django自带一个后台,访问localhost/admin/可以看到,如果想让自己创建的表格能够在后台可视化,需要将表格进行注册。在models所属app目录下编辑admin.py:
from django.contrib import admin
from app1.models.player import Player # 引入模型# Register your models here.admin.site.register(Player) # 注册模型
 
迁移后需要重启服务器,admin后台才能看到更新之后的自定义表格。
数据库操作
Django定义了一系列API对数据库执行操作,无需关注不同数据库间sql语句的差别,例如查询Player的所有记录:
from django.http import HttpResponse
from app1.models.player import Playerdef GetPlayersView(request):player = Player.objects.all()for p in player:print(p.idx)return HttpResponse("")
 
查
常用查询操作如下:
| 方法 | 描述 | 返回 | 
| all | 查询所有 | 查询集(可当做列表) | 
| filter | 多条查询 | 列表 | 
| get | 单条查询 | 一条数据,查询失败报错 | 
| count | 查询结果数 | 整数 | 
一般查询不确定结果使用filter,如查询一个idx为10010的用户,可以使用
player = Player.objects.filter(idx=10010)
if player:print(player[0].idx)
else:print("no result") 
这样可以避免get方法查询为空时的报错。
增
Player.objects.create(idx=1) 
删
players = Player.objects.filter(status=123)
for player in players:player.delete() 
改
# 单条修改
player = Player.objects.get(id=1)
player.status = 123
player.save()# 批量修改
players = Player.objects.filter(id=1).update(status=123) 
User模型
Django自带User模型,内置用户认证体系,开箱即用。
User模型常用字段:
| 字段 | 类型 | 描述 | 
| id | int | 主键,用户编号 | 
| username | varchar | 用户名 | 
| password | varchar | 密码 | 
| is_active | tinyint | 用户状态,为0则封号 | 
常用操作:
from django.contrib.auth.models import User# 创建user
User.objects.create_user(username="", password="")# 修改密码
user = User.objects.get(id=1)
user.set_password(passwd)
user.save()# 验证密码
user.check_password(passwd) 
Auth模块
常见方法:
| 方法 | 描述 | 
| authenticate(username, password) | 用户验证 | 
| login(HttpRequest, user) | 登录 | 
| logout(request) | 登出,注销会话 | 
| is_authenticated() | 用户登录状态 | 
用户登录视图:
from django.http import JsonResponse
from django.contrib.auth import authenticate, logindef signin(request):data = request.POSTusername = data.get("username")password = data.get("password")user = authenticate(username=username, password=password) # 验证用户if not user:return JsonResponse({"result": "用户名或密码错误"})if user.is_authenticated():return JsonResponse({"result": "用户已登录"})if user.is_authenticated():return JsonResponse({"result": "用户已登录"})if not user.is_active:return JsonResponse({"result": "账号被封"})# 登录用户login(request, user)return JsonResponse({"result": "success"})
 
扩展用户
Django自带的User未必能够满足我们所有的需求,故其提供了扩展User的方式,而个人更喜欢偷个懒,例如文章开头的Player想对User扩展,我会这样写:
from django.db import models
from django.contrib.auth.models import Userclass Player(models.Model):user = models.OneToOneField(User, on_delete=models.CASCADE)...def __str__(self):return str(self.user)
 
将User和Player俩个表做个关联,让user成为Player的一个字段来使用。
(模型的关系除了一对一OneToOneField,还有一对多ForeignKey和多对多ManyToManyField,on_delete的参数CASCADE表级联删除,还有PROTECT和DO_NOTHING等对扩展表的操作)
