django模型1

django支持各類主流的數據庫,項目根目錄中的db.sqlite就是數據庫文件,默認狀況下django配置的就是這個文件,它是個文件類型的數據庫,比較小
一.數據庫的鏈接配置
    django 鏈接mysql的配置流程:
     (1) 安裝 pymysql:   pip install pymysql
     (2)建立數據庫用戶   這裏須要有建立數據庫權限的用戶!
        1)可使用navicat管理mysql數據庫
        2)通常項目會有數據庫人員負責,這裏練習咱們使用root帳戶進入mysql而後建立一個有建立數據庫權限的用戶:
            (1)輸入命令,首先遠程鏈接SSH,mysql -uroot -pqwe123;進入mysql
            (2)建立新用戶:mysql> create user  zx_root   IDENTIFIED by 'xxxxx';   //identified by 會將純文本密碼加密做爲散列值存儲
                zx_root是用戶名,'xxxxx'是密碼,用戶名和密碼能夠替換爲咱們本身的內容,密碼要用引號括起來,
                ****注意mysql語句後面要有;才能結束
            (3)給權限:mysql> grant all on *.*  to zx_root;
            (4)查看用戶權限:mysql> show grants for zx_root;
            (5)使受權當即生效:FLUSH PRIVILEGES;

    (3)建立數據庫crm
        create database crm;    
    (4) 修改配置
        項目文件夾裏的settings下的DATABASES,default裏的'ENGINE'(引擎)的值,把backends(後端).後面的sqlite3改爲mysql
                                        把  'NAME'的值改成'crm'
                                             增長鍵值對'USER':'root',      ----若是上面建立好了有建立數據庫權限的用戶,則輸入該用戶的名字
                                              增長鍵值對'PASSWORD':'qwe123',        --------若是使用建立的用戶,填入該用戶的密碼
                                              增長鍵值對'HOST':'127.0.0.1',
                                              增長鍵值對'PORT':'3306',    #這裏用字符串或者數字均可以,最好字符串
    
    (5)修改項目文件夾(settings.py文件所在的目錄)下__init__.py 文件寫上:
        import pymysql    #若是環境中新裝的pymysql導入不了。close project一下從新進入
            pymysql.install_as_MySQLdb()    #歷史緣由,由於python2的時候用的MySQLdb,因此要加這個
    (6)設置時區 仍是在settings.py裏 TIME_ZONE = 'Asia/ShangHai' # 北京時間

二.django的ORM系統
    -對象關係映射(Object Relational Mapping,簡稱ORM)!
    底層仍是執行的SQL,必須經過SQL才能操做數據庫,只是寫代碼這一層看不到
    簡單的說就是用面向對象的方式,描述數據庫,操做數據庫,
    達到不用編寫SQL語句就能對數據庫進行增刪改查。
    映射關係:
    模型類對應數據表,類屬性對應表字段名,類的實例對應表中的一條數據
    模型類必須寫在app下的models.py文件中,模型若是須要映射到數據庫,所在的app必須被安裝
    

三.模型的建立與激活
    1.建立模型:(1)teacher這個app文件夾中的models.py中,建立類 class Student(models.Model)    --必須繼承models.Model
        Student的模型,表明學生
        (2)建立字段名(類變量,類屬性):1)name = models.CharField(max_length=)  
                 ---CharField自己也是一個類,他有一個必備參數max_length,至關於sql中varchar的長度
                           2)age = models.SmallIntegerField(default=0)  
                ---默認值default也能夠不給,
                           3)qq = models.CharField(max_length=20,default='')
                ---CharField 最好不要讓他None,能夠給個空字符串作默認值
                ---通常數據庫中qq,電話號碼這些用字符串而不是int類型,操做方便
                           4)c_time = models.DateTimeField(verbose_name='建立時間')
                ---建立時間字段,verbose_name參數是提示信息,是給人看的,人類可讀的名稱
                能夠是位置參數,放第一個,也能夠是關鍵字參數
                還能夠加一個參數auto_now_add=True,這樣就不須要手動輸入時間了,django自動幫咱們處理,
                    保存當前對象的時候就會自動填入當前時間
                         5)id 通常省略就好了,不用咱們手動添加,
                    若是模型類中咱們沒有定義主鍵,模型類會自動幫咱們加了一個以下的id類屬性
                    id = models.IntegerField(primary_key=True,auto_created=True)
                    建立的全部模型類實例都自動給個這個屬性
        總結:
        1. 每個模型都是django.db.models.Model的子類
        2. 類變量 表示模型中的數據庫字段
        3. 每個字段由一個字段類的實例表示
        注意:
        (1)每一個變量名也就是數據庫中表的列名,要機器友好,即用ASSIIC碼中的字符,不要用中文,不要用數字,不要_開頭,數字開頭
        (2)字段名中verbose_name參數通常都在第一個位置參數,指定人類可讀的名稱,若是定義時沒有加這個參數,則直接使用字段名
        (3)CharField字段必須提供max_length參數,他是必須參數,不光對數據模型起做用,也對數據庫起做用,還對校驗起做用(Form表單中會看到)
        (4)字段還有不少可選參數,好比default,它對應數據庫中的默認值
    2.激活模型:有了以上建立的模型,django會爲這個應用程序建立一個數據庫模式,
        也就是先會建立表,生成SQL語句,根據上面的模型類建立去訪問Student對象的python數據庫的API,
        爲了實現這些,咱們要在項目文件夾中的settings.py中註冊
        1.在項目中註冊app:INSTALLED_APPS中加入app名
        2.運行數據庫遷移命令(必定要在項目根目錄下)
            python manage.py makemigrations teacher    
                -若是不加app名teacher,則會對(settings.py的INSTALLED裏安裝過的)全部app進行遷移
            告訴django,咱們作了哪些數據庫的更改
            遷移,是django對模型的更改方式,會生成遷移文件,相似於app下的migrations文件夾下的0001_initial.py這樣,咱們甚至能夠手動更改遷移文件的內容
            遷移以後,mysql中能夠能夠進入建立的數據庫,這時修改只是被記錄下來,數據庫中尚未表
            sqlmigrate 從遷移獲取sql語句:python manage.py sqlmigrate teacher 0001   ---這裏不用寫全0001_initial.py,teacher這是應用名稱,必須寫上
                遷移會生成的SQL語句以下:
                --
                -- Create model Student
                --
                CREATE TABLE `teacher_student` (
                `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,         ---若是咱們沒有建立主鍵,這裏會自動建立名爲id的主鍵,至關於模型類自動默認給咱們添加了這個類屬性,
                `name` varchar(20) NOT NULL,
                `age` smallint NOT NULL,
                `sex` smallint NOT NULL,
                `qq` varchar(20) NOT NULL,
                `phone` varchar(20) NOT NULL,
                `c_time` datetime(6) NOT NULL);
                COMMIT;
        3.運行migrate命令,使遷移生效
            python manage.py migrate teacher    ---若是寫上app名,則只會遷移這個app中的模型,不寫則註冊過的都遷移
            這以後咱們建立的數據庫中才會生成表,
        # 表名 appname_模型name.lower
           django_migrations是默認生成的記錄migration的表
四.數據的增刪改查
    (1)工具 djang shell 調試工具(scrapy的shell借鑑了django的)
    用shell以前最好先在環境中裝ipython ,而後直接運行命令進入shell,只要裝了ipython,默認就能進入ipython的shell
    python manage.py shell
    (2)進入shell命令行後,首先導入models:from teacher.models import Student   ---輸一半按tag能夠補全
    想查看student中有沒有數據,能夠:           Student.objects      ----objects是模型的一個方法,它實際上是一個管理器,
        它自己也是一個對象,建立了模型它就連上了,每個模型都有一個objects,經過objects就能夠操做、管理模型
    (3)想查詢模型中全部的值,能夠Student.objects.all()   
         ---它返回的是一個查詢集對象,返回的值不算友好,默認返回<QuerySey:[<Student:Student Object(1)>,<Student:Student Object(2)>,....]>
        若是咱們想讓他運行時直接顯示實例對象的各個實例屬性打印出來,則模型類中能夠重寫方法__str__:
        def __str__(self):
            return '%s-%s'%(self.name,self.age)
        這個方法對數據庫不形成任何影響,不用作數據庫遷移,可是重寫後須要從新進入shell,並從新導入庫才能起做用,
        模型自動建立了id這個屬性,這裏重寫的__str__方法返回值多個self.id也是能夠的
         return '%d-%s-%s' % (self.id, self.name, self.age),建立的實例對象都帶個id的實例屬性
        若是建立了實例對象,這時候Student.objects.all()  的結果是<QuerySey:[<Student:1-貝吉塔-3>,<Student:2-特蘭克斯-17>,....]>
    (4)想查詢模型中某個值,能夠定義s = Student.objects.get(id=1),而後s,得到符合條件的某實例,s.name,s.age這樣還能查到該實例的對應屬性值

    (5) 增:
        4種方法:在shell環境中,無論什麼方法首先都要保證導入了models:from teacher.models import Student
            1)表中一條數據,對應模型類中的一個實例,即一個對象,建立一條,能夠實例化一下,表的字段在實例化的過程當中經過傳遞參數加進去
                (1)實例化:s1 = Student(name='貝吉塔',age='3',qq='123456')
                (2)保存: s1.save()      爲了不輸錯,實例化後數據庫中尚未數據,想把實例化的對象保存到數據庫,須要運行save方法
                注意存在數據庫中的時間字段必定是UTC時間,爲了避免同時區不一樣格式的統一,
                而取出來的時間則轉換成settings裏設置的時區,取出來的時間指的是是渲染在模板中顯示的時間
                模型類實例中怎麼查詢,打印,出來的還都是utc時間
            2)建立空實例,而後賦值
                (1)先建立一個空實例s2 = Student()
                (2)依次賦值實例屬性s2.name = '特蘭克斯'
                          s2.age = 17
                          .....
                  (3)保存:s2.save()
            3)直接create:Student.objects.create(實例屬性1,實例屬性2.。。)
                這種方法直接操做數據庫,給表添加記錄
                運行這個命令後,建立記錄同時,直接能夠返回剛建立的對象
            4)get_or_create:相似於上面的create
                s=Student.objects.get_or_create(實例屬性1,實例屬性2.。。)
                這種方式先查,查完再建立,返回一個元組,元組第一個元素是該對象,第二個元素是是否建立成功:
                    若是模型中已經有該對象,則元組第一個元素則是該對象,第二個元素是false,即沒有建立該對象,是查來的
                    若是模型中尚未該對象,則元組第一個元素是該對象,第二個元素是True,即建立了該對象,
                    ***親測是否同一對象取決於建立時給的參數是否徹底一致,前面同樣多給個元素,也會建立,而不是返回查詢結果和False的元組
                        別的參數相同,改其中一個參數,也會建立
            5)增長模型類實例數據,也能夠在app的視圖函數中,導入模型類,而後定義函數,增長類的實例,上述四種方法,能夠在視圖函數模塊中,先導入模型類
                from .models import Student
                def add_student(request):
                    方法一:實例化,而後save。。。。
                    方法二:實例化一個空的對象,而後定義實例屬性,而後save。。。
                    方法三:直接create
                    方法四:get_or_create
                    return render(request,模板文件)

    (6)查:
            1)Student.objects.all()  --查全部,他返回QuerySet對象
                (1)咱們寫res=Student.objects.all()的時候,這樣寫尚未操做數據庫,
                它是一個惰性的,只有咱們要把這個值計算出來的時候它才操做數據庫
                (2)查詢集能夠看到sql語句print(res.query),結果其實就是至關於select * from teacher_student的sql語句
                (3)shell中輸入res的時候返回的查詢集,他能夠循環能夠迭代,還能夠切片
                    切片print(res[1:2].query)
                    切片返回的結果比上面不切片的後面多了兩個東西LIMIT 1 OFFSET 1  
                    LIMIT --獲取數量,OFFSET偏移量
            2)Student.objects.get(條件)   --查詢一條,他返回的不是查詢集,而是一個對象,
            執行時馬上操做數據庫,沒有query,拿不到它的sql語句,只能在mysql日誌上看到他的sql語句
            至關於數據庫中的select * from 表名 where 條件。。。。
            ***get方法返回一條數據,若是匹配到符合條件的有不少條,則會報錯
                因此get方法通常只和主鍵對應,可是表裏的主鍵不見得都叫id
                這裏有個快捷方式pk,它表明了表的主鍵,無論表的主鍵叫什麼,用pk查均可以
            3)filter:res=Student.objects.filter(參數=值)  --返回查詢集
                           print(res.query)   -至關於sql中用where的結果

    (7)修改:
            1)賦值:s=Student.objects.get(name='xxx')
                           s.age=16
                           s.save()
                查完修改,用於改一條數據,別忘了save()保存的時候才能把修改保存到數據庫
            2)update:Student.objects.filter(name='xxx').update(age=16)
                把匹配出來的全部符合條件的數據的年齡都改爲16,返回修改的記錄條數
    (8)刪除:delete()方法
            1)刪一條:s=Student.objects.get(pk=2)
                s.delete()        ----返回一個元組,第一個元素是刪除的數據條數,第二個元素是{'表的名稱':刪除的數據條數}
            2)批量刪:Student.objects.filter(sex=1).delete()
                返回元素,(刪除的數據條數,{'表名':刪除的數據條數})
    (9)計數:Student.objects.count()    ----返回模型類實例數
五。應用到視圖:
    1.首先視圖函數的模塊中導入模型類:from .models import Student
    2.視圖函數中student=Student.objects.all()
    3.根據數據庫中表的字段修改對應模板的模板變量
    python

相關文章
相關標籤/搜索