Django笔记(五):模型models
首
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等对扩展表的操作)