# 設計模型
## 設計介紹
* **學生表結構設計**
* **表名:students**
* **學生名:stu\_name**
* **學生班級:stu\_grade**
* **學生性別:stu\_sex**
* **班級表結構設計**
* **表名:grades**
* **班級名:gra\_name**
* **班級人數:gra\_number**
## 數據庫配置
* 在settings.py文件中,通過DATABASES項進行數據的配置
* 配置mysql數據庫
```text
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'miku',
'USER':'root',
'PASSWORD':'123456',
'PORT':3306,
}
}
```
* 解釋:
* 'ENGINE':選擇數據庫,可為 'django.db.backends.postgresql\_psycopg2', 'django.db.backends.mysql', 'django.db.backends.sqlite3', 'django.db.backends.oracle'
* NAME':實際mysql1的database的名字,并不是數據庫的名字
* ‘USER’:'root',\#mysql數據庫用戶名
* 'PASSWORD':用戶對應的密碼
* 'HOST':數據庫主機地址
* 'POST':數據庫端口,默認端口為3306
* 在控制平臺中輸入mysql -u root -p
* 輸入密碼:123456
* 創建與之對應的數據庫名miku
## 創建應用
* 創建應用命令
```text
python manage.py startapp myapp
```
* 應用的目錄結構圖

## 定義模型類
* 一個數據表對應一個類
* 在models.py文件中,定義模型類
* 引入包名from django.db import models
* 模型類繼承自models.Model類
* 當輸出兌現時;會調用對象的str方法
_tips:不需要定義主鍵列,在生成的時候自動添加,并且值為自動增長_
```text
# model.py
from django.db import models
# Create your models here.
class grades(models.Model):
gra_name = models.CharField(max_length=20)
gra_number = models.IntegerField()
def __str__(self):
return "第%d個 | %s班 | 共有%d人數" % (self.pk,self.gra_name,self.gra_number)
class students(models.Model):
stu_name = models.CharField(max_length=20)
stu_grade = models.ForeignKey("grades",on_delete=models.CASCADE)
stu_sex = models.BooleanField()
stu_date = models.DateTimeField()
def __str__(self):
return "第%d個 | 姓名:%s | %s班 | 性別:%d |日期:%s" % \
(self.pk, self.stu_name, self.stu_grade,self.stu_sex,self.stu_date)
```
## 生成數據表
* 激活模型:編輯settings.py文件,將myapp應用加入到installed\_apps中
* ```text
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
```
* 生成遷移文件:根據模型類生成sql語句
```text
python manage.py makemigrations
```
```text
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
如果遇到這樣的錯誤
需要安裝pymysql模塊
命令安裝:pip install pymysql
然后再django項目的__init__下設置:
import pymysql
pymysql.install_as_MySQLdb()
```
```text
TypeError: __init__() missing 1 required positional argument: 'on_delete'
錯誤代碼:
stu_grade = models.ForeignKey("grades")
修改后:
stu_grade = models.ForeignKey("grades",on_delete=models.CASCADE)
```
```text
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost'
(using password: NO)")
這是由于用的mysql版本太新了,換成5.7版本的
mysql下載地址:https://dev.mysql.com/downloads/file/?id=478035
```

* 執行遷移:執行sql語句生成數據表
```text
python manage.py migrate
```

## 測試數據操作
* 進入python shell,進行簡單的模型api練習
```text
python manage.py shell
```
* 進入shell后提示如下:

* 引入需要的包:
```text
In [1]: from myapp.models import grades,students
In [2]: from django.utils import timezone
In [3]: from datetime import *
```
* 查詢所有班級信息
```text
In [4]: grades.objects.all()
Out[4]: <QuerySet []>
```
* 新建班級信息
```text
In [5]: a = grades()
In [6]: a.gra_name="1"
In [7]: a.gra_number=2
In [8]: a.save()
In [9]: a
Out[9]: <grades: 2>
```
* 查找班級信息
```text
In [4]: grades.objects.get(pk=1)
Out[4]: <grades: 第1個 | 班 | 共有25人數>
In [5]: grades.objects.get(pk=2)
Out[5]: <grades: 第2個 | 1班 | 共有2人數>
In [6]: a = grades.objects.get(pk=2)
In [7]: a
Out[7]: <grades: 第2個 | 1班 | 共有2人數>
```
* 修改班級信息
```text
In [9]: a = grades.objects.get(pk=1)
In [10]: a.gra_name = "2"
In [11]: a
Out[11]: <grades: 第1個 | 2班 | 共有25人數>
```
* 刪除班級信息
```text
In [16]: a.delete()
Out[16]: (1, {'myapp.students': 0, 'myapp.grades': 1})
```
## 關聯對象的操作
* 對于students表可以按照以上操作方式進行
* 添加、注意添加關聯對象
```text
In [34]: a = grades.objects.get(pk=2)
In [35]: a
Out[35]: <grades: 第2個 | 2班 | 共有26人數>
In [36]: b = students()
In [37]: b.stu_name = "miku"
In [38]: b.stu_grade = a
In [39]: b.stu_sex = 1
In [40]: b.stu_date = datetime(year=2017,month=10,day=26)
In [41]: b.save()
E:\Python36\lib\site-packages\django\db\models\fields\__init__.py:1423: RuntimeWarning: DateTimeField students.stu_date received a naive datetime (2017-10-26 00:00:00) while time zone support is active.
RuntimeWarning)
In [42]: b
Out[42]: <students: 第1個 | 姓名:miku | 第2個 | 2班 | 共有26人數班 | 性別:1 |日期:2017-10-26 00:00:00>
```

* 獲得關聯集合:返回當前grades對象的所有students對象
grades對象.students對象名\_set.all\(\)
```text
In [43]: a.students_set.all()
Out[43]: <QuerySet [<students: 第1個 | 姓名:miku | 第2個 | 2班 | 共有26人數班 | 性別:1 |日期:2017-10-26 00:00:00+00:00>]>
```
* 有一個students存在,必須要有一個grades對象,提供了創建關聯的數據
a.students.\_set.create\(\)
```text
In [44]: b = a.students_set.create(stu_name="miku",stu_sex=False,stu_date=datetime(year=2016,month=5,day=26)
...: )
E:\Python36\lib\site-packages\django\db\models\fields\__init__.py:1423: RuntimeWarning: DateTimeField students.stu_date received a naive datetime (2016-05-26 00:00:00) while time zone support is active.
RuntimeWarning)
In [45]: b
Out[45]: <students: 第2個 | 姓名:miku | 第2個 | 2班 | 共有26人數班 | 性別:0 |日期:2016-05-26 00:00:00>
```