1. 程式人生 > >在Django中使用ORM建立圖書管理系統

在Django中使用ORM建立圖書管理系統

複製程式碼
一、ORM(物件關係對映) 很多語言的web框架中都有這個概念
1、 為什麼要有ORM?
    1. 寫程式離不開資料,要使用資料就需要連線資料庫,但是不同的資料庫在sql語句上(mysql,oracle等)會有點區別,
        因此直接在你的專案中使用sql語句的話,不便於以後的修改,萬一更換了資料庫,那所有sql語句不就要重新寫嗎?
        所以這個時候ORM就體現出優點了,你只需要寫ORM的程式碼,它就會根據你連線的資料庫自動幫你翻譯成對應的sql語句,
        也就是說無論你使用的是mysql還是oracle,ORM操作資料庫的語句都是一樣的。
        
        
    
2. 不使用ORM時在Python程式中使用資料庫的操作如下: 1. 使用pymysql連線MySQL資料庫的步驟 1. import pymysql 2. 建立連線 conn = pymysql.connect( host='127.0.0.1', # 資料庫的ip地址 port=3306, # 資料庫的埠 database='db1
', # 要使用哪個資料庫 user='root', # 使用者名稱 password='123abc', # 密碼 charset='utf8' # 編碼(記得別寫utf-8) ) 3. 獲取游標物件 cursor = conn.cursor() --> 預設返回((), ()) cursor
= conn.cursor(cursor=pymysql.cursors.DictCursor) --> 預設返回[{}, {}] 4. 執行sql語句 cursor.execute('select * from userinfo') cursor.execute('select * from userinfo where username=%s and password=%s', ['ming', '1234']) 5. 獲取結果 1. cursor.fetchone() # 獲取一條 2. cursor.fetchall() # 獲取全部 3. cursor.fetchmany(size) # 獲取size個 2、 ORM(Object Relational Mapping)是什麼? 1. 新的語法,不需要我們自己寫SQL語句 2. 我們按照新的語法寫程式碼,他幫我翻譯成SQL語句 3、 ORM優缺點 ORM優點: 1. 開發效率高 2. 容易掌握 3. 容易移植 ORM的缺點: 1. 程式碼的執行效率低 4、ORM的對映 python中的類 對應 資料庫中的表 類中的屬性 對應 資料庫中的欄位 類的物件 對應 資料庫中的記錄 5、ORM能做哪些事情 1. 操作資料庫中的表 2. 操作資料庫中的記錄 3. 不能操作資料庫,建庫還是得你自己用sql語句建立 6、Django中使用ORM的步驟 1. 在settings那裡設定databases,告訴Django框架連線哪個資料庫 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 告訴Django要連線的是MySQL資料庫 'NAME': 'db1', # 資料庫名稱 'HOST': '127.0.0.1', # 資料庫的IP 'PORT': 3306, # 資料庫的埠 'USER': 'root', # 連線資料的賬號 'PASSWORD': '123abc' # 連線資料庫的密碼 } } 2. 告訴Django框架用什麼連線資料庫 在和settings.py同目錄下的__init__.py檔案中: import pymysql pymysql.install_as_MySQLdb() 3. 在app下面的models.py這個檔案中定義類 from django.db import models class 類名(models.Model): pass 4. 兩個命令修改資料庫中的表(DDL語言) 1. python manage.py makemigrations --> 在app/migrations上記錄models.py的變更 2. python manage.py migrate --> 把變更記錄翻譯成SQL語句,去資料庫執行 7、ORM建立欄位的語法 id = models.AutoField(primary_key=True) # 建立自增的id主鍵 password = models.CharField(max_length=20) # varchar(20) publisher = models.ForeignKey(to='外來鍵關聯的類名') # 建立外來鍵publisher,會自動關聯另一種表的主鍵
   book = models.ManyToManyField(to='Book')  # ORM幫我們自動建立的第三張表(用於多對多查詢)
   age = models.IntegerField() # 建立整型的欄位
8、ORM記錄操作語法 1、取記錄 1.all取全部(列表) data = 類名.objects.all() # 取到類的所有物件,也就是取到資料庫中某個表的所有記錄,返回一個列表,列表每個元素就是每一條記錄 data[0] # 代表第一個物件,物件對應著表中的第一條記錄 data[0].id # 取第一個物件的id值,也就是取表中的第一條記錄的id欄位的值 2.filter篩選(列表)[篩選出所有滿足條件的物件組合成一個列表] filter篩選的結果是一個列表,即ret是列表,ret[0]才是篩選出來的物件,ret[0].id是這個物件的屬性值,即記錄的欄位值 ret = 類名.objects.filter(id=1) 3.get篩選(物件)[get只能得到一個物件,即使滿足條件的不止一個,get也只能拿到第一個滿足條件的物件] get篩選的結果是一個物件,即ret是物件 ret = 類名.objects.get(id=1)
2、新增記錄 # 把資料新增到資料庫中 類名.objects.create(類的屬性(欄位)=新的值) 3、刪除記錄 類名.objects.filter(id=1).delete() # 篩選出id=1的物件(記錄),然後在資料庫中把它刪除 類名.objects.get(id=1).delete() 4、修改記錄 1.基於物件的修改
      obj = 類名.objects.get(id=1) obj.name
= '新的值' # 此時只是在python中修改了屬性的值 obj.save() # 把改動提交到資料庫
      get只能找一個物件,如果找不到或者找到的物件多於一個,會報錯
2.基於QuerySet的update修改 類名.objects.filter(條件).update(欄位='新值')
       如果filter找到的物件有多個,那麼update就是批量更新這些物件
9、HTML中的特殊符號(模板語言) 1、用傳進來的引數替換msg {{ msg }} 2、for迴圈 {% for item in iterable %}
    內容 {
% endfor %} 例如: {% for i in list1 %} <tr> <td>{{ forloop.counter }}</td> // forloop代表for迴圈,forloop.counter代表迴圈到第幾次,相當於序號 <td>{{ i }}</td> </tr> {% endfor %}


  3、for empty 如果迴圈的物件內容為空,則執行empty的語句
   {% for item in iterable %}
      內容1
    {% empty %}
      內容2
    {% endfor %}

    例如:
    {% for book in author.book.all %}     book.title
    {% empty %}
      暫無作品
    {% endfor %}

4、if判斷 {% if 條件 %} 內容1 {% else %} 內容2 {% endif %} 10、request 1、request.POST 通過POST方法提交給伺服器的資料都會存在request.POST裡面,request.POST是一個類似於字典的型別, 取值方法跟字典一樣,可以根據鍵去取值,也可以通過get方法,例如: request.POST["name"] # 拿到鍵為name的資料 request.POST.get("name",None) # 拿到鍵為name的資料,若這個資料不存在,則返回None
   request.POST.getlist('name') # 當表單提交的資料是一個列表(多選的checkbox和select的提交),需要使用getlist獲取這個列表
2、request.GET 通過GET方法提交給伺服器的資料都會存在request.GET裡面,request.GET是一個類似於字典的型別, 取值方法跟字典一樣,可以根據鍵去取值,也可以通過get方法,request.GET是從URL中取引數,例如: request.GET["id"] # 拿到URL中引數為id的資料 request.GET.get("id",None) # 拿到URL中引數為id的資料,若這個引數不存在,則返回None   注意:POST請求的URL中也是可以帶引數的

3、request.method request.method就是獲取客戶端提交資料的方式(POST、GET等) 二、 圖書管理系統 1、 表結構 0. 使用者表 1. 出版社 2. 書籍 3. 作者表 4. 作者和書籍的關係表 2、使用者表的建立 # 使用者表 class Userinfo(models.Model): id = models.AutoField(primary_key=True) email = models.CharField(max_length=20) password = models.CharField(max_length=20) 3、 出版社的增刪改查 # 出版社表 class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=20) 1. 查 1. ORM: Publisher.objects.all() --> 查詢所有的出版社資料 2. HTML中寫for迴圈(模板語言) {% for i in [..., ...] %} {% endfor %} 2. 增 1. ORM建立資料 Publisher.objects.create(name='新出版社名稱') 3. 刪 1. HTTP中URL新增引數 /delete_publisher/?id=1 2. 如何在Django中獲取URL中的引數 request.GET --> 一個大字典 request.GET.get('id') --> 取值 3. ORM中刪除操作 Publisher.objects.filter(id=1).delete() 4. 改 1. ORM修改 obj.name = '新出版社名稱' obj.save() --> 把改動提交到資料庫 4、 書籍的增刪改查 # 書籍表 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=20) publisher = models.ForeignKey(to='Publisher') 0. ORM中定義外來鍵 models.ForeignKey(to='外來鍵關聯的類名') 注意事項: ORM在資料庫中會給外來鍵欄位自動加_id 1. 查詢 book_obj.publisher --> 書籍關聯的出版社物件 book_obj.publisher_id --> 書籍關聯的出版社id(資料庫中真正儲存的那一列的值) 2. 刪除 Book.objects.filter(id=1).delete() Book.objects.get(id=1).delete() 3. 新增 1. 新增頁面把所有的出版社資料展示成select標籤 2. 模態框新增,區別於跳轉到新頁面新增!!! 3. 新增(注意引數!!!) 1. Book.objects.create(title=new_title, publisher=Publisher.objects.get(id=publisher_id)) # publisher是ORM幫我們建立的指向外來鍵關聯的表的物件 2. Book.objects.create(title=new_title, publisher_id=publisher_id) # publisher_id是一個在資料庫中具體存放的值 4. 編輯 1. 模板語言 if 判斷 {% if publisher == book.publisher %} <option selected value="{{ publisher.id }}">{{ publisher.name }}</option> {% else %} <option value="{{ publisher.id }}">{{ publisher.name }}</option> {% endif %} 2. 注意.save() 5、作者表的增刪改查 # 作者表(兩張表要實現多對多的關係,需要藉助第三張表才能實現) class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) # 作者名稱 age = models.IntegerField() # 年齡 book = models.ManyToManyField(to='Book') # ORM幫我們自動建立的第三張表(用於多對多查詢) 注意:book = models.ManyToManyField(to='Book')相當於建立了下面的第三張表,用來關聯作者和書籍多對多的關係 class Author_Book(models.Model): id = models.AutoField(primary_key=True) author = models.ForeignKey(to='Author') book = models.ForeignKey(to='Book') 1. ORM多對多語法 1. book = models.ManyToManyField(to='Book') 2. 優勢 1. 幫我們建立第三張關係表 2. 提供了很多方便的管理方法 1. author_obj.book.all() --> 查詢作者關聯的所有書籍 2. author_obj.book.add(id1,id2) --> 給作者新增關聯書籍資訊 3. author_obj.book.set([id1, di2,...]) --> 給作者設定關聯書籍資訊 2. 作者表的增刪改查 1. 查 1. author_obj.book.all() # ORM會自動幫我們實現連表查詢,找出作者對應的所有資訊 2. 在Django的模板語言(HTML)中,方法不需要加括號 2. 增 1. author_obj.book.add(*[]) # ORM會自動幫我們實現連表查詢,然後實現第三張表的增加 3. 刪除 1. author_obj.delete() # Django1.x的版本外來鍵預設設定了級聯操作,在作者表刪除作者,第三張表也會自動刪除對應的記錄 2. 補充Django2.0以上的版本 外來鍵需要手動設定級聯操作 on_delete=models.CASCADE 多對多需要手動設定級聯操作 db_constraint=True 4. 修改 1. author_obj.book.set([]) # ORM會自動幫我們實現連表查詢,然後實現第三張表的修改 三、Django小結 1、 新建Django專案的步驟 1. 建立專案和建立APP 2. 配置settings.py 1. 檢查Templates資料夾是否配置好 2. 配置靜態檔案相關 1. STATIC_URL = '/static/' --> 預設配好的 2. STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), --> 自己在專案目錄下新建一個存放靜態檔案的資料夾:static ] 3. 註釋掉csrf相關的那一行 4. 配置好資料庫的連線資訊 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', ... } }
      然後去和settings同級的__init__.py下:
        import pymysql
        pymysql.install_as_MySQLdb()
5. 配置好app的資訊 INSTALLED_APPS = [ ... '自己的app' --> 先建立APP再註冊APP ] 2、 Django中知識點 1. request --> 所有跟請求相關的資料都封裝到這個物件 1. request.method --> 請求方法的全大寫(GET/POST/...) 2. request.GET --> 獲取URL中的引數(類似字典),POST請求的URL也可以帶引數 request.GET['key'] request.GET.get('key', None) 3. request.POST --> 獲取POST請求中攜帶的引數(類似字典) 2. 基礎的三個方法 1. HttpResponse --> 返回字串 2. render --> 返回頁面 1. render(request, 'xx.html') 2. render(request, 'xx.html', {'key': value}) 3. redirect --> 重定向 1. redirect('/publisher/') --> 重定向到當前專案的其他頁面 2. redirect('https://www.baidu.com') --> 重定向到其他頁面

四、Django流程圖
 
  
   複製程式碼
   
  
 

 

複製程式碼
一、ORM(物件關係對映) 很多語言的web框架中都有這個概念
1、 為什麼要有ORM?
    1. 寫程式離不開資料,要使用資料就需要連線資料庫,但是不同的資料庫在sql語句上(mysql,oracle等)會有點區別,
        因此直接在你的專案中使用sql語句的話,不便於以後的修改,萬一更換了資料庫,那所有sql語句不就要重新寫嗎?
        所以這個時候ORM就體現出優點了,你只需要寫ORM的程式碼,它就會根據你連線的資料庫自動幫你翻譯成對應的sql語句,
        也就是說無論你使用的是mysql還是oracle,ORM操作資料庫的語句都是一樣的。
        
        
    2. 不使用ORM時在Python程式中使用資料庫的操作如下:
        1. 使用pymysql連線MySQL資料庫的步驟
            1. import pymysql
            2. 建立連線
                conn = pymysql.connect(
                    host='127.0.0.1',       # 資料庫的ip地址
                    port=3306,              # 資料庫的埠
                    database='db1',         # 要使用哪個資料庫
                    user='root',            # 使用者名稱
                    password='123abc',      # 密碼
                    charset='utf8'          # 編碼(記得別寫utf-8)
                )
            3. 獲取游標物件
                cursor = conn.cursor()                                     --> 預設返回((), ())
                cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)    --> 預設返回[{}, {}]
            4. 執行sql語句
                cursor.execute('select * from userinfo')
                cursor.execute('select * from userinfo where username=%s and password=%s', ['ming', '1234'])
            5. 獲取結果
                1. cursor.fetchone()        # 獲取一條
                2. cursor.fetchall()        # 獲取全部
                3. cursor.fetchmany(size)   # 獲取size個
                
                
2、 ORM(Object Relational Mapping)是什麼?
    1. 新的語法,不需要我們自己寫SQL語句
    2. 我們按照新的語法寫程式碼,他幫我翻譯成SQL語句
    
    
3、 ORM優缺點
    ORM優點:
        1. 開發效率高
        2. 容易掌握
        3. 容易移植    
    ORM的缺點:
        1. 程式碼的執行效率低
        
        
4、ORM的對映
    python中的類        對應         資料庫中的表
    類中的屬性           對應         資料庫中的欄位
    類的物件             對應         資料庫中的記錄
    
    
5、ORM能做哪些事情
    1. 操作資料庫中的表
    2. 操作資料庫中的記錄
    3. 不能操作資料庫,建庫還是得你自己用sql語句建立
    
    
6、Django中使用ORM的步驟
    1. 在settings那裡設定databases,告訴Django框架連線哪個資料庫
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',  # 告訴Django要連線的是MySQL資料庫
                'NAME': 'db1',        # 資料庫名稱
                'HOST': '127.0.0.1',  # 資料庫的IP
                'PORT': 3306,         # 資料庫的埠
                'USER': 'root',       # 連線資料的賬號
                'PASSWORD': '123abc'  # 連線資料庫的密碼
            }
        }
        
    2. 告訴Django框架用什麼連線資料庫
        在和settings.py同目錄下的__init__.py檔案中:
            import pymysql
            pymysql.install_as_MySQLdb()
            
    3. 在app下面的models.py這個檔案中定義類
        from django.db import models
        class 類名(models.Model):
            pass
            
    4. 兩個命令修改資料庫中的表(DDL語言)
        1. python manage.py makemigrations     --> 在app/migrations上記錄models.py的變更
        2. python manage.py migrate            --> 把變更記錄翻譯成SQL語句,去資料庫執行
    

7、ORM建立欄位的語法
    id = models.AutoField(primary_key=True)          # 建立自增的id主鍵
    password = models.CharField(max_length=20)       # varchar(20)
    publisher = models.ForeignKey(to='外來鍵關聯的類名')  # 建立外來鍵publisher,會自動關聯另一種表的主鍵
   book = models.ManyToManyField(to='Book')  # ORM幫我們自動建立的第三張表(用於多對多查詢)
   age = models.IntegerField() # 建立整型的欄位
8、ORM記錄操作語法 1、取記錄 1.all取全部(列表) data = 類名.objects.all() # 取到類的所有物件,也就是取到資料庫中某個表的所有記錄,返回一個列表,列表每個元素就是每一條記錄 data[0] # 代表第一個物件,物件對應著表中的第一條記錄 data[0].id # 取第一個物件的id值,也就是取表中的第一條記錄的id欄位的值 2.filter篩選(列表)[篩選出所有滿足條件的物件組合成一個列表] filter篩選的結果是一個列表,即ret是列表,ret[0]才是篩選出來的物件,ret[0].id是這個物件的屬性值,即記錄的欄位值 ret = 類名.objects.filter(id=1) 3.get篩選(物件)[get只能得到一個物件,即使滿足條件的不止一個,get也只能拿到第一個滿足條件的物件] get篩選的結果是一個物件,即ret是物件 ret = 類名.objects.get(id=1)
2、新增記錄 # 把資料新增到資料庫中 類名.objects.create(類的屬性(欄位)=新的值) 3、刪除記錄 類名.objects.filter(id=1).delete() # 篩選出id=1的物件(記錄),然後在資料庫中把它刪除 類名.objects.get(id=1).delete() 4、修改記錄 1.基於物件的修改
      obj = 類名.objects.get(id=1) obj.name
= '新的值' # 此時只是在python中修改了屬性的值 obj.save() # 把改動提交到資料庫
      get只能找一個物件,如果找不到或者找到的物件多於一個,會報錯
2.基於QuerySet的update修改 類名.objects.filter(條件).update(欄位='新值')
       如果filter找到的物件有多個,那麼update就是批量更新這些物件
9、HTML中的特殊符號(模板語言) 1、用傳進來的引數替換msg {{ msg }} 2、for迴圈 {% for item in iterable %}
    內容 {
% endfor %} 例如: {% for i in list1 %} <tr> <td>{{ forloop.counter }}</td> // forloop代表for迴圈,forloop.counter代表迴圈到第幾次,相當於序號 <td>{{ i }}</td> </tr> {% endfor %}


  3、for empty 如果迴圈的物件內容為空,則執行empty的語句
   {% for item in iterable %}
      內容1
    {% empty %}
      內容2
    {% endfor %}

    例如:
    {% for book in author.book.all %}     book.title
    {% empty %}
      暫無作品
    {% endfor %}

4、if判斷 {% if 條件 %} 內容1 {% else %} 內容2 {% endif %} 10、request 1、request.POST 通過POST方法提交給伺服器的資料都會存在request.POST裡面,request.POST是一個類似於字典的型別, 取值方法跟字典一樣,可以根據鍵去取值,也可以通過get方法,例如: request.POST["name"] # 拿到鍵為name的資料 request.POST.get("name",None) # 拿到鍵為name的資料,若這個資料不存在,則返回None
   request.POST.getlist('name') # 當表單提交的資料是一個列表(多選的checkbox和select的提交),需要使用getlist獲取這個列表
2、request.GET 通過GET方法提交給伺服器的資料都會存在request.GET裡面,request.GET是一個類似於字典的型別, 取值方法跟字典一樣,可以根據鍵去取值,也可以通過get方法,request.GET是從URL中取引數,例如: request.GET["id"] # 拿到URL中引數為id的資料 request.GET.get("id",None) # 拿到URL中引數為id的資料,若這個引數不存在,則返回None   注意:POST請求的URL中也是可以帶引數的

3、request.method request.method就是獲取客戶端提交資料的方式(POST、GET等) 二、 圖書管理系統 1、 表結構 0. 使用者表 1. 出版社 2. 書籍 3. 作者表 4. 作者和書籍的關係表 2、使用者表的建立 # 使用者表 class Userinfo(models.Model): id = models.AutoField(primary_key=True) email = models.CharField(max_length=20) password = models.CharField(max_length=20) 3、 出版社的增刪改查 # 出版社表 class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=20) 1. 查 1. ORM: Publisher.objects.all() --> 查詢所有的出版社資料 2. HTML中寫for迴圈(模板語言) {% for i in [..., ...] %} {% endfor %} 2. 增 1. ORM建立資料 Publisher.objects.create(name='新出版社名稱') 3. 刪 1. HTTP中URL新增引數 /delete_publisher/?id=1 2. 如何在Django中獲取URL中的引數 request.GET --> 一個大字典 request.GET.get('id') --> 取值 3. ORM中刪除操作 Publisher.objects.filter(id=1).delete() 4. 改 1. ORM修改 obj.name = '新出版社名稱' obj.save() --> 把改動提交到資料庫 4、 書籍的增刪改查 # 書籍表 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=20) publisher = models.ForeignKey(to='Publisher') 0. ORM中定義外來鍵 models.ForeignKey(to='外來鍵關聯的類名') 注意事項: ORM在資料庫中會給外來鍵欄位自動加_id 1. 查詢 book_obj.publisher --> 書籍關聯的出版社物件 book_obj.publisher_id --> 書籍關聯的出版社id(資料庫中真正儲存的那一列的值) 2. 刪除 Book.objects.filter(id=1).delete() Book.objects.get(id=1).delete() 3. 新增 1. 新增頁面把所有的出版社資料展示成select標籤 2. 模態框新增,區別於跳轉到新頁面新增!!! 3. 新增(注意引數!!!) 1. Book.objects.create(title=new_title, publisher=Publisher.objects.get(id=publisher_id)) # publisher是ORM幫我們建立的指向外來鍵關聯的表的物件 2. Book.objects.create(title=new_title, publisher_id=publisher_id) # publisher_id是一個在資料庫中具體存放的值 4. 編輯 1. 模板語言 if 判斷 {% if publisher == book.publisher %} <option selected value="{{ publisher.id }}">{{ publisher.name }}</option> {% else %} <option value="{{ publisher.id }}">{{ publisher.name }}</option> {% endif %} 2. 注意.save() 5、作者表的增刪改查 # 作者表(兩張表要實現多對多的關係,需要藉助第三張表才能實現) class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) # 作者名稱 age = models.IntegerField() # 年齡 book = models.ManyToManyField(to='Book') # ORM幫我們自動建立的第三張表(用於多對多查詢) 注意:book = models.ManyToManyField(to='Book')相當於建立了下面的第三張表,用來關聯作者和書籍多對多的關係 class Author_Book(models.Model): id = models.AutoField(primary_key=True) author = models.ForeignKey(to='Author') book = models.ForeignKey(to='Book') 1. ORM多對多語法 1. book = models.ManyToManyField(to='Book') 2. 優勢 1. 幫我們建立第三張關係表 2. 提供了很多方便的管理方法 1. author_obj.book.all() --> 查詢作者關聯的所有書籍 2. author_obj.book.add(id1,id2) --> 給作者新增關聯書籍資訊 3. author_obj.book.set([id1, di2,...]) --> 給作者設定關聯書籍資訊 2. 作者表的增刪改查 1. 查 1. author_obj.book.all() # ORM會自動幫我們實現連表查詢,找出作者對應的所有資訊 2. 在Django的模板語言(HTML)中,方法不需要加括號 2. 增 1. author_obj.book.add(*[]) # ORM會自動幫我們實現連表查詢,然後實現第三張表的增加 3. 刪除 1. author_obj.delete() # Django1.x的版本外來鍵預設設定了級聯操作,在作者表刪除作者,第三張表也會自動刪除對應的記錄 2. 補充Django2.0以上的版本 外來鍵需要手動設定級聯操作 on_delete=models.CASCADE 多對多需要手動設定級聯操作 db_constraint=True 4. 修改 1. author_obj.book.set([]) # ORM會自動幫我們實現連表查詢,然後實現第三張表的修改 三、Django小結 1、 新建Django專案的步驟 1. 建立專案和建立APP 2. 配置settings.py 1. 檢查Templates資料夾是否配置好 2. 配置靜態檔案相關 1. STATIC_URL = '/static/' --> 預設配好的 2. STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), --> 自己在專案目錄下新建一個存放靜態檔案的資料夾:static ] 3. 註釋掉csrf相關的那一行 4. 配置好資料庫的連線資訊 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', ... } }
      然後去和settings同級的__init__.py下:
        import pymysql
        pymysql.install_as_MySQLdb()
5. 配置好app的資訊 INSTALLED_APPS = [ ... '自己的app' --> 先建立APP再註冊APP ] 2、 Django中知識點 1. request --> 所有跟請求相關的資料都封裝到這個物件 1. request.method --> 請求方法的全大寫(GET/POST/...) 2. request.GET --> 獲取URL中的引數(類似字典),POST請求的URL也可以帶引數 request.GET['key'] request.GET.get('key', None) 3. request.POST --> 獲取POST請求中攜帶的引數(類似字典) 2. 基礎的三個方法 1. HttpResponse --> 返回字串 2. render --> 返回頁面 1. render(request, 'xx.html') 2. render(request, 'xx.html', {'key': value}) 3. redirect --> 重定向 1. redirect('/publisher/') --> 重定向到當前專案的其他頁面 2. redirect('https://www.baidu.com') --> 重定向到其他頁面

四、Django流程圖
 
 
  複製程式碼