1. 数据库相关
1.1 使用pymysql将sqlite迁移到mysql
在项目的setting.py的DATABASES中进行配置
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DjangoDemo',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': 3306
}
}
在pycharm中创建mysql数据源 测试连接
再将原本存在于sqlite总的模型、数据表迁移到Mysql中
错误做法
# 控制台命令
# python manage.py makemigrates # 这里不用,创建模型之后生成迁移文件的时候使用
python manage.py migrate # 执行已经生成的迁移文件
会报错,提示要求安装mysqlclient,mysqlclient对mysql的安装要求较高
我选择安装pymysql
正确做法
- 安装pymysql:
# 控制台 pip install pymysql - i https://pypi.douban.com/simple
- 对pymysql进行“伪装”,在项目的init.py文件中:
import pymysql pymysql.install_as_MySQLdb()
- 执行迁移
python manage.py migrate
notice:mysql版本必须高于5.5,建议5.7
迁移顺利完成。
1.2 创建新应用全过程
创建一个新的APP,命名为Three。在终端控制台:
python manage.py startapp Three
在项目的settings,py中注册:
INSTALLED_APPS = [
...
'Three.apps.ThreeConfig'
]
在APP Three中创建urls.py,创建子路由
urlpatterns = [
path('index/', views.index)
]
在项目路由中包含子路由
urlpatterns = [
...
path('three/', include('Three.urls'))
]
再在Three.vIews中创建index函数
def index(request):
# 方法一
three_index = loader.get_template('threeIndex.html')
result = three_index.render()
print(result)
return HttpResponse(result)
# 方法二
# return render(result, 'threeIndex.html')
创建APP的模板文件夹templates
在该文件夹内创建ThreeIndex.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Three Index</title>
</head>
<body>
<h1>Three Index</h1>
<h4>sleeping</h4>
</body>
</html>
在浏览器可成功访问:
1.3 数据库常规操作——级联数据
表和表的关系
- 一对一 :外键+约束
- 一对多:外键
- 多对多:两个外键
数据级联
- 在Three的model中创建两个类:Class和Student,其中,student有属性s_class,是外键。
class Class(models.Model): c_name = models.CharField(max_length=64) class Student(models.Model): s_name = models.CharField(max_length=16) s_age = models.IntegerField() s_class = models.ForeignKey(Class, on_delete=models.CASCADE)
- 生成迁移文件并执行
python manage.py makemigrations python manage.py migrate
可以看到数据库中成功生成了两个数据表
- 手动插入数据
-
级联查询
-
查询某个学生所在的班级
在views.py中:
def get_class_by_student(request): student = Student() s1 = student.objects.get(pk=1) s_class = student.s_class.c_name context = { 's_class': s_class } return render(request, 'getClassbyStudent.html', context=context)
其中,模板文件为:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Class</title> </head> <body> <h2>{{ s_class }}</h2> </body> </html>
-
运行效果:
- 查询某个班级的所有学生
views.py:
def get_students_by_class(request):
c1 = Class.objects.get(pk=1)
# 关键代码
students = c1.student_set.all()
context = {
'students': students
}
return render(request, 'student_three_list.html', context=context)
模板代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Student List</title>
</head>
<body>
<ul>
{% for student in students %}
<li>{{ student.s_name }}</li>
{% endfor %}
</ul>
</body>
</html>
关键部分总结
一对多的关系中:
由一找多(由班级找学生): students = c1.student_set.all()
由多找一(由学生找班级):student.s_class.c_name