Django中的模型对应数据库中的一张表格。
player.py
from django.db import models
class 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 Player
def 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)
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)
常见方法:
方法 | 描述 |
authenticate(username, password) | 用户验证 |
login(HttpRequest, user) | 登录 |
logout(request) | 登出,注销会话 |
is_authenticated() | 用户登录状态 |
用户登录视图:
from django.http import JsonResponse
from django.contrib.auth import authenticate, login
def signin(request):
data = request.POST
username = 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 User
class 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等对扩展表的操作)