文章目录
1.3 模型
1.3.1 基础配置
1.3.1.1 数据连接配置
- 安装Pymysql库
pip install pymysql
- settings文件配置
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dj_demo',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'dj_demo',
'PASSWORD': '123456'
}
}
- 特殊情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ghCjEUb9-1620716472472)(6DE380E4BF814812B4A04A52507424DB)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ikJyv7lw-1620716472474)(95D05605373841228B40C3AFCBD058AA)]
解决办法
主APP__init__.py文件做如下配置
import pymysql
pymysql.version_info = (1, 3, 13, 'final', 0) #pymsql版本
pymysql.install_as_MySQLdb()
1.3.2 Model类
1.3.2.1 创建model类
在对应APP目录下新建models.py文件
类:对应数据的物理表
类属:性对应数据库的字段
表名默认为:APP名称_类名
from django.db import models
# Create your models here.
class Student(models.Model):
name = models.CharField(max_length=20)
gender = models.CharField(max_length=10)
score = models.FloatField()
指定数据库物理表名
class Teacher(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
gender = models.FloatField()
#内部类指定表名
class Meta:
db_table = 'teacher'
1.3.2.2 迁移模型
- 生成迁移计划
项目根目录下执行相关命令
python manage.py makemigrations
- 执行迁移任务
python manage.py migrate
或
python manage.py migrate APP名称
1.3.3 数据操作
1.3.3.1 新增数据
# 方式一
stu = Student.objects.create(name="小白", gender="男", score=55)
# 方式二
stu = Student(name="韩梅", gender="男", score=85)
stu.save()
1.3.3.2 删除数据
stu = Student.objects.get(name="小白")
stu.delete()
re = stu
1.3.3.3 修改数据
stu = Student.objects.get(name="小明")
stu.gender = "女"
stu.save()
1.3.3.4 数据查询
- 简单查询
stu = Student.objects.get(id=3) # get方法只能查询单条记录
stu = Student.objects.all()
- 过滤查询
stu = Student.objects.filter(gender="女")
- 魔法查询
"""
1.日期格式
__year
__month
__day
2.字符串
__startswith
__endswith
__contains
3.大于、小于、等于
__gte 大于等于
__lte 小于等于
__eq 等于
"""
stu = Student.objects.filter(score__gte=85)
- 排除查询
stu = Student.objects.exclude(score__gt=85)
- 限制查询
stu = Student.objects.all()[1:3]
stu = Student.objects.all()[::2]
# 排序
stu = Student.objects.order_by("score") # 升序
stu = Student.objects.order_by("-score", "-name") # 降序在对应字段前加“-”号
- 原生查询
stu = Student.objects.raw("select * from my_app_student order by score desc")
# 模糊查询需要用%%对百分号进行转义
stu = Student.objects.raw("select * from my_app_student where name like '%%小%%'")
# 多条件查询
stu = Student.objects.raw("select * from my_app_student where name like '%%小%%' and gender = '男'")
stu = Student.objects.raw("select * from my_app_student where name like '{}' and gender ='{}'".format('%%小%%', '男'))
- Q查询
q1 = Q(gender = "男")
q2 = Q(score__gte = 90)
stu = Student.objects.filter(q1&q2) # &为且
q3 = Q(name__startswith ="李")
q4 = Q(score__gte = 85)
stu =Student.objects.filter(q3|q4) # |为或
- F查询 主要用来做更新操作
stu = Student.objects.get(id=6)
stu.score = F("score") + 5
stu.save()
- 聚合查询 数据量大的时候谨慎使用
stu = Student.objects.aggregate(Avg("score")) #返回字典{'score__avg': 82.71428571428571}
stu = Student.objects.aggregate(avg_score = Avg("score")) #指定返回字典的键值为avg_score
stu = Student.objects.all().aggregate(avg_score = Avg("score"))
- 分组查询
stu = Student.objects.values("gender").annotate(Avg("score"))
1.3.3.5 自定义对象管理器
新建模型类和对象管理器并与之关联
from django.db import models
from django.db.models import Manager
class CakeManager(Manager): #自定义对象管理器
def create_cake(self, cake_type, price):
new_model = self.model() # 实例化的与该对象管理器关联的对象
new_model.cake_type = cake_type
new_model.price = price
print()
new_model.save()
return new_model
def query_all(self):
return super().all()
class Cake(models.Model):
cake_type = models.CharField(max_length=20)
price = models.FloatField()
cake_manager = CakeManager() # 关联自定义对象管理器
调用自定义对象管理器
from django.shortcuts import render
from common.method.base import result_to_list
from my_app.models import Cake, CakeManager
def create_cake(request):
cake = Cake.cake_manager.create_cake("生日", 200)
re = result_to_list([cake])
data = {
"tag": "插入了数据",
"re": re
}
return render(request, "../templates/my_app/cake.html", context = data)
def delete_cake(request):
cake = Cake.cake_manager.filter(id = 32)
re = result_to_list(cake)
cake.delete()
data = {
"tag": "删除数据",
"re": re
}
return render(request, "../templates/my_app/cake.html", context = data)
def update_cake(request):
cake = Cake.cake_manager.get(id = 33)
cake.cake_type = "生日"
cake.save()
re = result_to_list([cake])
data = {
"tag": "数据修改为",
"re": re
}
return render(request, "../templates/my_app/cake.html", context=data)
def select_cake(request):
cake = Cake.cake_manager.query_all()
re = result_to_list(cake)
data = {
"tag": "查询结果",
"re": re
}
return render(request, "../templates/my_app/cake.html", context=data)
1.3.4 模型之间的关
- 模型类创建
from django.db import models
# Create your models here.
# 一对多模型关系
class School(models.Model): # 一方模型
name = models.CharField(max_length=64)
addr = models.CharField(max_length=64)
history = models.TextField()
def __str__(self):
return self.name
class Student(models.Model): # 多方模型
name = models.CharField(max_length=64)
gender = models.CharField(max_length=4)
age = models.IntegerField()
school = models.ForeignKey(School, on_delete=models.CASCADE) # 设置外键
1.3.4.1 一对多
- 模型类创建
from django.db import models
# Create your models here.
# 一对多模型关系
class School(models.Model): # 一方模型
name = models.CharField(max_length=64)
addr = models.CharField(max_length=64)
history = models.TextField()
def __str__(self):
return self.name
class Student(models.Model): # 多方模型
name = models.CharField(max_length=64)
gender = models.CharField(max_length=4)
age = models.IntegerField()
school = models.ForeignKey(School, on_delete=models.CASCADE) # 设置外键
- 对象间的关联
def create_student(request):
# 方式一:通过“多方”模型的外键类属性关联“一方”模型的实例化对象
school = School.objects.get(id = 1)
student = Student.objects.create(name = "小明", gender = "男", age=19, school=school)
# 方式二:通过“多方”对应表的外键关联“一方”
student = Student.objects.create(name = "郭靖", gender = "男",age = "19",school_id = 2)
student = Student.objects.create(name = "黄蓉", gender = "女",age = "19",school_id = 3)
re = result_to_list([student])
data = {
"tag": "添加成功",
"re": re
}
return render(request, "../templates/model_relation/student.html", context= data)
- 查询
def search_one_to_more(request):
# 1.从一查多,”一方“的实例化对象.“多方”模型类名小写_set.all()
school = School.objects.get(id = 3)
re = school.student_set.all()
# 2.从多查一,通过“多方”设置的关联属性查询
student = Student.objects.get(id = 3)
re = [student.school]
# 查询数据处理与查询方式无关
re = result_to_list(re)
data = {
"tag": "查询结果",
"re": re
}
return render(request, "../templates/model_relation/search.html", context=data)
1.3.4.2 一对一
- 模型类创建
class Student(models.Model):
name = models.CharField(max_length=64)
gender = models.CharField(max_length=4)
age = models.IntegerField()
school = models.ForeignKey(School, on_delete=models.CASCADE)
# 一对一模型关系 一个学生只对应一个学籍,一个学籍也只能对应一个学生
class StudentStatus(models.Model):
student = models.OneToOneField(Student, on_delete=models.CASCADE)
number = models.CharField(max_length=16, unique=True)
state = models.CharField(max_length=8)
- 对象间的关联
def create_status(request):
# 方式一:通过主动一方模型类属性,关联另一方对象
# status = StudentStatus.objects.create(student= Student.objects.get(id = 3), number = "000002", state= "在读")
# 方式二通过对应表的唯一外键字段关联
student_id = Student.objects.filter(name = "黄蓉")[0].id
status = StudentStatus.objects.create(student_id = student_id, number = "000003",state = "在读")
re = result_to_list([status])
data = {
"tag": "添加成功",
"re": re
}
return render(request, "../templates/model_relation/status.html", context= data)
- 查询
def search_one_to_one(request):
# 1.从维护关系一方查:使用模型类中维护关系的那个类属性
status = StudentStatus.objects.get(id = 1).student
re = [status]
# 2.从不维护关系的一方查:使用对方类名的小写
student = Student.objects.get(id = 1).studentstatus
re = [student]
# 查询数据处理与查询方式无关
re = result_to_list(re)
data = {
"tag": "查询结果",
"re": re
}
return render(request, "../templates/model_relation/search.html", context=data)
1.3.4.3 多对多
- 模型类创建
class Student(models.Model):
name = models.CharField(max_length=64)
gender = models.CharField(max_length=4)
age = models.IntegerField()
school = models.ForeignKey(School, on_delete=models.CASCADE)
def __str__(self):
return self.name
# 多对多模型关系 学生和社团的关系
class Community(models.Model):
name = models.CharField(max_length=128)
build_time = models.DateField()
member = models.ManyToManyField(Student, through="StudentCommunity") # 维护关系的一方指定需要的关联的模型类和第三方模型类
def __str__(self):
return self.name
# 通过第三方模型进行关联
class StudentCommunity(models.Model):
member = models.ForeignKey(Student, on_delete=models.CASCADE)
community = models.ForeignKey(Community, on_delete=models.CASCADE)
join_reason = models.CharField(max_length=256)
- 对象间的关联
def create_student_community(request):
# 通过被关联方的实例化的对象或实例化对象的id属性进行关联
community = StudentCommunity.objects.create(member = Student.objects.get(id = 6),
community = Community.objects.get(id = 2),
join_reason="喜欢高科技")
re = result_to_list([community])
data = {
"tag": "添加成功",
"re": re
}
return render(request, "../templates/model_relation/community.html", context= data)
- 查询
def search_many_to_many(request):
community = Community.objects.get(id = 1)
student = Student.objects.get(id = 6)
re = StudentCommunity.objects.filter(member = student )
# 2.从主动维护关系的“多方”查询:通过关联的类属性查询另一方.all()
re = Community.objects.get(id = 2).member.all()
# 3.从不负责维护关系的多方查询:对方模型类名小写_set.all()
re = Student.objects.get(id = 1).community_set.all()
print("-----------------------|",re)
re = result_to_list(re)
data = {
"tag": "查询结果",
"re": re
}
return render(request, "../templates/model_relation/search.html", context=data)
1.3.4.4 模型外键自关联
- 模型类的创建
# 一对多自关联
class Organization(models.Model):
num = models.CharField(max_length = 10)
name = models.CharField(max_length = 64)
function = models.CharField(max_length = 256)
parent_organization = models.ForeignKey("self", on_delete = models.CASCADE, null = True) #外键自引用
- 对象间的关联
def create_organization(request):
# 新建一级组织
organization = Organization.objects.create(num="0000010000", name="总裁办", function="协助总裁处理日常事务")
organization = Organization.objects.create(num="0000020000", name="财务部", function="制定企业财务相关制度,并执行,其他与财务相关的的事物办理")
organization = Organization.objects.create(num="0000030000", name="人事部", function="制定企业人事相关制度,负责人员招聘,其他与财务相关的的事物办理")
organization = Organization.objects.create(num="0000040000", name="报表事业部", function="报表产品的开发")
organization = Organization.objects.create(num="0000040000", name="资产事业部", function="资产管理产品开发")
organization = Organization.objects.create(num="0000040000", name="政府事业部", function="为政府客户提供服务")
organization = Organization.objects.create(num="0000050000", name="企业事业部", function="为企业客户提供服务")
# 新建二级组织
organization = Organization.objects.create(num="0000040100", name="实施一部", function="经济建设行业",
parent_organization=Organization.objects.get(id = 6))
organization = Organization.objects.create(num="0000040200", name="实施二部", function="行业协会",
parent_organization=Organization.objects.get(id = 6))
organization = Organization.objects.create(num="0000040300", name="实施三部", function="教育行业",
parent_organization=Organization.objects.get(id = 6))
# 新建三级组织
organization = Organization.objects.create(num="0000040101", name="项目一组", function="报表业务",
parent_organization=Organization.objects.get(id = 8))
organization = Organization.objects.create(num="0000040102", name="项目二组", function="资产业务",
parent_organization=Organization.objects.get(id = 8))
organization = Organization.objects.create(num="0000040101", name="项目三组", function="大数据业务",
parent_organization=Organization.objects.get(id = 8))
re = result_to_list([organization])
data = {
"tag": "添加成功",
"re": re
}
return render(request, "../templates/model_relation/community.html", context= data)
- 查询
def search_one_to_many(request):
# 1.从一查多,”一方“的实例化对象.“多方”模型类名小写_set.all()
organization = Organization.objects.get(id = 6)
re = organization.organization_set.all()
# 2.从多查一,通过“多方”设置的关联属性查询
organization = Organization.objects.get(id = 9)
re = [organization.parent_organization]
# 查询数据处理与查询方式无关
re = result_to_list(re)
data = {
"tag": "查询结果",
"re": re
}
return render(request, "../templates/model_relation/search.html", context=data)