此文章仅作为学习记录
小白学python以此记录为后期复习使用。
欢迎各位大佬来指点文中出现错误的地方。
小白学python交流群(自己创建,无任何商业活动):912477250
持续更新中…
各位朋友,对你有帮助的话,请点个赞呗。谢谢~
import pymsl
pymsql.instrall_as_MSQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'yaoyaomingming', # 数据库名
'USER': 'root', # 数据库用户
'PASSWORD': '123456', # 数据库密码
'HOST': 'localhost', # 数据库IP地址
'PROT': '3306' # 数据库端口号,默认3306
}
}
python-admin startproject project
python manage.py startapp myApp
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp' # 激活myApp应用
]
在 setting.py
文件中,通过 DATABASES
选项进行数据库配置。
python3.x 安装的是PyMySql
# 配置mysql数据库
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sunck', # 数据库名
'USER': 'root', # 数据库用户
'PASSWORD': '123456', # 数据库密码
'HOST': 'localhost', # ip地址
'PORT': '3306' # mysql默认端口3306
}
}
一个模型类都在数据库中对应一张数据表
在项目文件加project下执行 python manage.py makemigrations
出现此处报错:TypeError: ForeignKey.init() missing 1 required positional argument: ‘on_delete’
解决方法:
django升级到2.0之后,表与表之间关联的时候必须写"on_delete"参数,否则会报错
扩展补充说明
参数 | 说明 |
---|---|
on_delete = None | 删除关联表的数据时,当前表与关联表的filed的行为。 |
on_delete = models.CASCADE | 表示级联删除,当关联表(子表)中的数据删除时,与其相对应的外键(父表)中的数据也删除。 |
on_delete = models.DO_NOTHING | 你删你的,父亲(外键)不想管你 |
on_delete = models.PROTECT | 保护模式,如采用这个方法,在删除关联数据时会抛出ProtectError错误 |
on_delete = models.SET_DEFAULT | 设置默认值,删除子表字段时,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。 |
on_delete = models.SET(值) | 删除关联数据时,自定义一个值,该值只能是对应指定的实体 |
on_delete = models.SET_NULL | 置空模式,删除时,外键字段被设置为空,前提就是blank=True, null=True,定义该字段时,允许为空。理解:删除关联数据(子表),与之关联的值设置默认值为null(父表中),这个前提需要父表中的字段可以为空。 |
执行后会新建一个文件:
在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据库表。
python manage.py runserver ip:port
python manage.py runserver
简单示例:
3.1415926
max_digits = 8
decimal_places=7
-True/False 字段。 此字段的默认表单控制是CheckboxInput。布尔值。
说明: 该字段默认对应的表单控件是一个TextInput。在管理员站点添加了一个JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外的invalid_date错误消息键。
注意: auto_now_add、auto_now、and default 这些设置是相互排斥的,它们之间的任何组合将会发生错误的结果。
grade = Grades()
grade.students_set # 用一访问多, 访问一个班级有多少个学生。
对象.模型类小写
示例
grade = Grades()
grade.students # 用于一访问一。 访问内班级中的一位同学
studnet = Students()
student.sgrade_id # 访问学生属于那个班级的id
# 学生
class Students(models.Model):
snmae = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
# 所属班级 关联外键 # 不加on_delete参数时,生成迁移文件是会报错。
sgrade = models.ForeignKey("Grades", on_delete=models.DO_NOTHING)
lastTime = models.DateTimeField(auto_now=True)
createTime = models.DateTimeField(auto_now_add=True)
# 元选项
class Meta:
db_table = 'students'
ordering = ['id']
是Manager类型的对象,作用是与数据库进行交互。
当定义模型类时没有指定管理器,那么Django为模型创建一个名为objects的管理器。
# 学生
class Students(models.Model):
# 当定自定义模型管理器,objects就不存在了
stuObj = models.Manager()
向管理器类中添加额外的方法
修改管理器返回的原始查询集
class StudentsManager(models.Manager):
def get_queryset(self):
# 逻辑删除的不要,只查询没有逻辑删除的。
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
# 学生
class Students(models.Model):
# 自定义模型管理器
# 当定自定义模型管理器,objects就不存在了
stuObj = models.Manager()
stuObj2 = StudentsManager()
向数据库添加数据
当创建对象时,Django不会对数据建库进行读写操作,当调用save()方式时才与数据库交互,将对象保存到数据库中。
注意:__init__方法已经在父类models.Model中使用。在自定义的模型中无法使用。
# 定义一个类方法创建对象
@classmethod
def createStudents(cls, name, age, gender, contend, grade, last, create, isDel=False):
stu = cls(snmae=name,sage=age,sgender=gender,scontend=contend,sgrade=grade,lastTime=last,createTime=create,isDelete=isDel)
return stu
# 学生管理器
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
# 创建对象,添加数据
def createStudent(self, name, age, gender, contend, grade, last, create, isDel=False):
stu = self.model()
stu.snmae = name
stu.sage = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
stu.lastTime = last
stu.createTime = create
stu.isDelete = isDel
return stu
from django.db import models
# Create your models here.
# 班级
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
# 元选项
class Meta:
db_table = 'grades'
ordering = ['-id']
# 学生管理器
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
# 创建对象,添加数据
def createStudent(self, name, age, gender, contend, grade, last, create, isDel=False):
stu = self.model()
stu.snmae = name
stu.sage = age
stu.sgender = gender
stu.scontend = contend
stu.sgrade = grade
stu.lastTime = last
stu.createTime = create
stu.isDelete = isDel
return stu
# 学生
class Students(models.Model):
# 自定义模型管理器
# 当定自定义模型管理器,objects就不存在了
stuObj = models.Manager()
stuObj2 = StudentsManager() #创建管理器用于查询代替objects
snmae = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False)
# 所属班级 关联外键 # 不加on_delete参数时,生成迁移文件是会报错。
sgrade = models.ForeignKey("Grades", on_delete=models.DO_NOTHING)
lastTime = models.DateTimeField(auto_now=True)
createTime = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.snmae} -- {self.sage}'
# 元选项
class Meta:
db_table = 'students'
ordering = ['id']
# 定义一个类方法创建对象
@classmethod
def createStudents(cls, name, age, gender, contend, grade, last, create, isDel=False):
stu = cls(snmae=name, sage=age, sgender=gender, scontend=contend,sgrade=grade, lastTime=last, createTime=create, isDelete=isDel)
return stu
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
from myApp.models import Students, Grades
def index(request):
return HttpResponse('欢迎来到Django的视图模块...')
def students(request):
studentsList = Students.stuObj2.all()
return render(request, 'myApp/index.html', {'students': studentsList})
def addStudent(request):
grade = Grades.objects.get(pk=1)
stu = Students.createStudents('耀明',34,True,'我叫耀明,请多关照。',grade,'2022-07-23','2022-08-01')
stu.save()
return HttpResponse(f"添加成功!")
def addStudent2(request):
grade = Grades.objects.get(pk=1)
stu = Students.stuObj2.createStudent('杳杳明明',34,True,'我叫杳杳明明,请多关照。',grade,'2022-07-23','2022-08-01')
stu.save()
return HttpResponse(f"添加成功!")
查询集表示从数据库获取的对象集合
查询可以有多个过滤器
过滤器就是一个函数,基于所给的参数限制查询集结果。
从sql角度来书,查询集合select语句等价。过滤器就像where条件语句。
在管理器上调用过滤器方法返回查询集
查询集经过过滤器帅选后返回新的查询集,所以可以写成链式调用。
# 显示前5条数据
studentsList = Students.stuObj2.all()[0:5]
# 分页显示学生
def stuPage(request, curPage):
# 分页 (curPage-1)*pageSize,pageSize
# curPage 当前页码
# pageSize 每页显示的数量
curPage = int(curPage)
studentsList = Students.stuObj2.all()[(curPage-1)*5:curPage*5] # 显示前5条数据
return render(request, 'myApp/index.html', {'students': studentsList})
from django.urls import path, include, re_path
from . import views
urlpatterns = [
re_path(r'^$', views.index),
re_path(r'^students/$', views.students),
re_path(r'^addStudent/$', views.addStudent),
re_path(r'^addStudent2/$', views.addStudent2),
re_path(r'^stu/(\d+)/$', views.stuPage), # 分页查询
]
每个查询集都包含一个缓存,来最小化的对数据库访问。
在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存。Django会将查询出来的数据做一个缓存,并返回查询结构,以后的查询直接使用查询集的缓存。
实现了sql中的where语句,作为方法filter()、exclude()、get()的参数
语法
like语句中使用%是为了匹配占位,特殊字符。匹配数据中的%(where like ‘%’)
filter(snmae__contains=‘%’) # %不用转义
说明:判断,大小写敏感
示例:filter(isDelete=False)
# 查找含有张氏的记录
Students.stuObj2.filter(snmae__contains='张氏')
说明:以value开头或结尾,大小写敏感
示例
# 开头以杳杳的记录
studentsList = Students.stuObj2.filter(snmae__startswith='杳杳')
以上四个在前面加上i ,就表示不区分大小写。iexact、icontains、istartswith、iendswith(exact, contains, startswith、endswith)
说明:是否为空
示例:filter(snmae__isnull=False)
studentsList = Students.stuObj2.filter(pk__in=[3,4,5,15,17])
# 年龄大于30岁的学生
studentsList = Students.stuObj2.filter(sage__gt=30)
# 查找lastTime字段日期在2022年的记录
studentList = Students.stuObj2.filter(lastTime__year=2022)
gradel = Grades.objects.get(pk=1)
gradel.students_set.all()
grade = Grades.objects.filter(students__scontend__contains='杳杳')
print(grade[0].gname)
print(type(grade))
gradel = Grades.objects.get(pk=1)
stu3 = gradel.students_set.create(snmae=u'王五',sgender=True,scontend=u'我叫王五',sage = 50)
注意:直接添加到数据库中。
代表的主键
from django.db.models import Max
maxAge = Students.stuObj2.aggregate(Max('sage'))
from django.db.models import F, Q
def grades(request):
g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))
print(g)
return HttpResponse('....')
from django.db.models import F, Q
def grades(request):
g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
print(g)
return HttpResponse('....')
studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gte=34))