settings.py文件中 默认为sqlite数据库 更改成mysql数据库
实例:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'helloworld',
'HOST':'127.0.0.1',
'PORT':3306,
'PASSWORD':'123456',
'USER':'root',
}
}
project的init.py文件中宏 添加代码如下
import pymysql
pymysql.install_as_MySQLdb()
随着项目越来越大 采用原生SQl的方式 在代码中就会出现大量的SQL语句 那么就会出现如下问题:
什么是ORM?
orm中文叫做关系映射 通过ORM我们可以通过类的方式去操作数据库 而不用再去写原生的SQL语句 通过把表映射成类 把行作为实例 把字段作为属性 ORM在执行对象操作数据库的时候 最终还是会转换为操作数据库的原生SQL语句
使用ORM优点:
字段名称 | 字段说明 | 参数 |
---|---|---|
AutoField | 一个根据实际ID自动增长的IntegerField 通常不指定(自动生成) | |
CharField | varchar类型字段 | max_length 存储值的最大长度 |
TextField | longtext类型长文本 | |
IntegerField | int类型字段 存储整形 | |
DecimalField | 存储浮点型 更加精准(存储) | max_digits=None 位数长度 decimal_places=None 小数的位数 |
FloatField | 存储浮点类型 | |
BooleanField | 存储Bool值 True/False | |
NullBooleanField | 存储null/True/False | |
DateField | date子段 | auto_now=False 如果对数据进行修改 则会自动保存修改的时间 auto_now_add=False 会自动保存第一次保存数据的时间 俩个参数不能同时使用 |
TimeField | time字段 | 参数同上 |
DateTimeField | datetime字段 | 参数同上 |
可选参数 | 参数说明 |
---|---|
null | 如果设置为True 则当前字段值可以为null |
blank | 如果设置为True 则当前字段可以为空(什么值都没有) |
db_column | 设置字段名称 不设置 字段默认名称为属性名 |
db_index | 常规索引 |
unique | 唯一索引 |
primary_key | 主键索引 |
default | 默认值 |
一个模型类 对应数据库中的一张表 一个类数学对应表中的一个字段
models.py
from django.db import models
# Create your models here.
class Test(models.Model):
char = models.CharField(max_length=20,default='默认值',db_index=True)
text = models.TextField(null=True,blank=True)
inter = models.IntegerField(db_column='inte')
deci = models.DecimalField(max_digits=5,decimal_places=2)
float = models.FloatField()
bool = models.BooleanField()
null = models.NullBooleanField()
date = models.DateField(auto_now=True)
time = models.TimeField(auto_now=True)
datetime = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.char
注意:
blank=True 只能用在字符串的字段类型上 不能用在数值上
python3 manage.py makemigrations
python3 manage.py migrate
注意:
数据库中表结构
mysql> desc test;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| char | varchar(20) | NO | MUL | NULL | |
| text | longtext | YES | | NULL | |
| inte | int(11) | NO | | NULL | |
| deci | decimal(5,2) | NO | | NULL | |
| float | double | NO | | NULL | |
| bool | tinyint(1) | NO | | NULL | |
| null | tinyint(1) | YES | | NULL | |
| date | date | NO | | NULL | |
| time | time(6) | NO | | NULL | |
| datetime | datetime(6) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
在模型类中定义一个Meta类
class Test(models.Model):
...
class Meta:
db_table = 'test' # 修改表名为test 默认名称为App_test
ordering = ['id'] # 查询出来的数据 按照id升序
ordering = ['-id'] # 查询出来的数据 按照id降序
当对模型进行了修改 则需要再次进行上一步3的操作
python3 manage.py shell
from django.shortcuts import render,HttpResponse
from App.models import Test # 导入Test模型类
# 添加数据
def insert(req):
# 第一种添加数据的方式
"""
t = Test()
t.char = 'char'
t.text = 'text'
t.inter = 1
t.deci = 1.234
t.float = 1.11
t.bool = True
t.null = None
t.save()
"""
# 第二种在实例化的时候传递关键词参数
t = Test(char='char',text='text',inter=1,deci=1.222,float=1.1,bool=False,null=True)
t.save()
return HttpResponse('添加数据')
# 查询数据
def select(req):
# 查询主键为1的数据 pk也就是primary_key的缩写
t = Test.objects.get(pk=1)
# print(t)
# 根据属性获取出想要的数据
print(t.char)
print(t.deci)
print(t.float)
return HttpResponse('查询')
# 数据的修改
def update(req):
# 修改主键为1的数据
t = Test.objects.get(pk=1)
t.char = 'lucky'
t.save()
return HttpResponse('数据的修改')
# 数据的删除
def delete(req):
# 删除id为2 的数据
t = Test.objects.get(pk=2)
t.delete()
return HttpResponse('删除')
类属性
是Manager类的一个对象 作用是与数据库进行交互
当定义模型的时候 没有指定模型管理器 则Django会默认为当前模型类创建一个名为objects的管理器
class Test(models.Model):
# 自定义模型管理器名称
testobj = models.Manager()
注意:
当自定义模型管理器的名称为testobj的时候 则默认的objects模型管理器不存在了
视图函数中使用
# 查询数据
def select(req):
# 查询主键为1的数据 pk也就是primary_key的缩写
t = Test.testobj.get(pk=1)
# print(t)
# 根据属性获取出想要的数据
print(t.char)
print(t.deci)
print(t.float)
return HttpResponse('查询')
概述:
模型管理器是django模型与数据库进行交互的接口 一个模型可以有多个模型管理器
作用:
实例
模型类中
from django.db import models
class UserManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(sex=True)
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=20,db_index=True,default='lucky')
sex = models.BooleanField(default=True)
age = models.IntegerField(default=18)
info = models.CharField(max_length=20,default='我是帅气的lucky老师')
createtime = models.DateTimeField(auto_now_add=True)
userobj = UserManager() # 添加了过滤查询集的方法
objects = models.Manager()
def __str__(self):
return self.username
class Meta:
db_table = 'user'
视图函数中使用
# 查询
def showData(req):
# all 查询所有
# u = User.objects.all()
u = User.userobj.all()
return render(req,'show_data.html',{'data':u})
目的:
向数据库中添加数据
注意:
不能够在自定义的模型中 使用init构造方法 原因是已经在父类中models.Model中使用了
实例:
models.py
class User(models.Model):
...
@classmethod
def addUser(cls,username='lucky',sex=True,age=18,info='我是帅气的lucky老师'):
obj = cls(username=username,sex=sex,age=age,info=info)
return obj
视图函数中使用
# 测试使用类方法添加数据 如果全部都给值 会更加方便
def my_add(req):
u = User.addUser('lucky',False,18)
u.save()
return HttpResponse('自定义类方法进行数据的添加')
概述:
# 原生查询
# 注意Linux下严格区分大小写
u = User.objects.raw('select * from user')
# 支持索引和切片操作
u = User.objects.raw('select * from user')[0:5]
u = User.objects.raw('select * from user')[0]
u = User.objects.raw('select * from user limit 5')
类名.objects.all()
切片操作 可以节约内存
实例
u = User.objects.all()
u = User.objects.all()[:5]
实现分页案例
# 实现分页
try:
page = int(req.GET.get('page',1))
except:
page = 1
u = User.objects.all()[(page-1)*3:page*3]
类名.objects.filter(属性名=值…)
如果参数为多个 那么为and操作
实例:
u = User.objects.filter(sex=True)
# 查询性别为True 并且名字包含力的数据
u = User.objects.filter(sex=True,username__contains='力')
# 等同于上面的写法
u = User.objects.filter(sex=True).filter(username__contains='力')
类名.objects.exclude(属性名=值)
实例
# 查询性别不为True的数据
u = User.objects.exclude(sex=True)
# 查询性别不为True 并且名字不包含力的数据
u = User.objects.exclude(sex=True, username__contains='力')
# 等同于上面的写法
u = User.objects.exclude(sex=True).exclude(username__contains='力')
升序
order_by(‘id’)
降序
order_by(’-id’)
实例:
# 按照年龄升序查询
u = User.objects.order_by('age')
# 按照年龄降序查询
u = User.objects.order_by('-age')
# 可以使用filter或exclude 对数据进行筛选过滤后再次排序
u = User.objects.filter().order_by('-age')
return render(req,'show_data.html',{'data':u})
对order_by的反转
实例:
# 按照年龄降序查询
u = User.objects.order_by('age').reverse()
# 按照年龄升序查询
u = User.objects.order_by('-age').reverse()
类名.objects.values()
实例:
u = User.objects.values()
# 只返回字段为id username age的值
u = User.objects.values('id','username','age')
结果:
类名.objects.values_list()
实例:
u = User.objects.values_list()
结果:
<QuerySet [(1, ‘张力’, True, 44, ‘我是张力的简介’, …