1. 數(shù)據(jù)庫(kù)相關(guān)
1.1 使用pymysql將sqlite遷移到mysql
在項(xiàng)目的setting.py的DATABASES中進(jìn)行配置
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中創(chuàng)建mysql數(shù)據(jù)源 測(cè)試連接
再將原本存在于sqlite總的模型墨辛、數(shù)據(jù)表遷移到Mysql中
錯(cuò)誤做法
# 控制臺(tái)命令
# python manage.py makemigrates # 這里不用纪他,創(chuàng)建模型之后生成遷移文件的時(shí)候使用
python manage.py migrate # 執(zhí)行已經(jīng)生成的遷移文件
會(huì)報(bào)錯(cuò)缔刹,提示要求安裝mysqlclient,mysqlclient對(duì)mysql的安裝要求較高
我選擇安裝pymysql
正確做法
- 安裝pymysql:
# 控制臺(tái) pip install pymysql - i https://pypi.douban.com/simple
- 對(duì)pymysql進(jìn)行“偽裝”偶妖,在項(xiàng)目的init.py文件中:
import pymysql pymysql.install_as_MySQLdb()
- 執(zhí)行遷移
python manage.py migrate
notice:mysql版本必須高于5.5城看,建議5.7
遷移順利完成。
1.2 創(chuàng)建新應(yīng)用全過(guò)程
創(chuàng)建一個(gè)新的APP肮之,命名為T(mén)hree。在終端控制臺(tái):
python manage.py startapp Three
在項(xiàng)目的settings,py中注冊(cè):
INSTALLED_APPS = [
...
'Three.apps.ThreeConfig'
]
在APP Three中創(chuàng)建urls.py卜录,創(chuàng)建子路由
urlpatterns = [
path('index/', views.index)
]
在項(xiàng)目路由中包含子路由
urlpatterns = [
...
path('three/', include('Three.urls'))
]
再在Three.vIews中創(chuàng)建index函數(shù)
def index(request):
# 方法一
three_index = loader.get_template('threeIndex.html')
result = three_index.render()
print(result)
return HttpResponse(result)
# 方法二
# return render(result, 'threeIndex.html')
創(chuàng)建APP的模板文件夾templates
在該文件夾內(nèi)創(chuàng)建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>
在瀏覽器可成功訪問(wèn):
1.3 數(shù)據(jù)庫(kù)常規(guī)操作——級(jí)聯(lián)數(shù)據(jù)
表和表的關(guān)系
- 一對(duì)一 :外鍵+約束
- 一對(duì)多:外鍵
- 多對(duì)多:兩個(gè)外鍵
數(shù)據(jù)級(jí)聯(lián)
- 在Three的model中創(chuàng)建兩個(gè)類(lèi):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)
- 生成遷移文件并執(zhí)行
python manage.py makemigrations python manage.py migrate
可以看到數(shù)據(jù)庫(kù)中成功生成了兩個(gè)數(shù)據(jù)表
數(shù)據(jù)庫(kù) - 手動(dòng)插入數(shù)據(jù)
-
級(jí)聯(lián)查詢(xún)
-
查詢(xún)某個(gè)學(xué)生所在的班級(jí)
在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>
-
運(yùn)行效果:
- 查詢(xún)某個(gè)班級(jí)的所有學(xué)生
views.py:
def get_students_by_class(request):
c1 = Class.objects.get(pk=1)
# 關(guān)鍵代碼
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>
關(guān)鍵部分總結(jié)
一對(duì)多的關(guān)系中:
由一找多(由班級(jí)找學(xué)生): students = c1.student_set.all()
由多找一(由學(xué)生找班級(jí)):student.s_class.c_name