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

複製代碼
1、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() 四、修改記錄 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 %}


  三、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等) 2、 圖書管理系統 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會自動幫咱們實現連表查詢,而後實現第三張表的修改 3、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') --> 重定向到其餘頁面

4、Django流程圖
 
  
複製代碼
相關文章
相關標籤/搜索