django模型系統(一)

本文轉載自https://blog.csdn.net/xiaogeldx/article/details/87899499python

django的orm簡介

  • 對象關係映射(英語:Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不一樣類型系統的數據之間的轉換 。從效果上說,它實際上是建立了一個可在編程語言裏使用的--「虛擬對象數據庫」。
  • orm的優點:用面向對象的方式描述數據庫,操做數據庫,不用直接編寫sql代碼,只需像操做對象同樣從數據庫操做數據mysql

    django的orm系統的分析

  • orm系統的方法-(封裝)-Python代碼-(執行)-sql語句-(操做)-數據庫sql

    django模型映射關係

  • 模型類必須都寫在app下的models.py文件中
  • 模型若是須要映射到數據庫,所在的app必須被安裝
  • 一個數據表對應一個模型類,表中的字段對應模型中的類屬性,一個實例對應數據表中的一條數據shell

    數據庫鏈接配置

  • django不光支持mysql,一些流行的數據庫都支持數據庫

    django鏈接MySQL的配置流程

  • 安裝pymysql:pip install pymysql
  • 建立數據庫用戶(有數據庫權限的用戶)
  • 建立數據庫(個人是django_test)
  • 修改配置(settings.py)django

    DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'django_test',
              'USER':'xiaoge',
              'PASSWORD':'*****',
              'HOST':'127.0.0.1',
              'PORT':'****'
          }
      }
  • 修改項目文件夾(和settings.py文件所在的目錄)下的__init__.py添加代碼:編程

    import pymysql
      pymysql.install_as_MySQLdb()
  • 設置時區(settings.py)app

    TIME_ZONE = 'Asia/ShangHai' #北京時間

    模型的建立與映射

    建立模型

  • 建立一個student的模型,表明學生
  • 每個模型都是django.db.models.Model的子類
  • 類變量表示模型中的數據庫字段
  • 每個字段由一個字段類的實例表示
  • 數據表的名稱就是模型的名稱
  • 在students中的models.py文件中建立模型編程語言

    from django.db import models
      class Student(models.Model):     #繼承
          #能夠不寫主鍵,模型會建立
          # id = models.IntegerField(primary_key=True,auto_created=True)  
          name = models.CharField(max_length=20)  #字符串
          age = models.SmallIntegerField(default=0)   #整數,默認爲0,表示沒填
          sex = models.SmallIntegerField(default=1)   #整數,默認爲1(男)
          qq = models.CharField(max_length=20,default='') #字符串,默認不填
          phone = models.CharField(max_length=20,default='')  #字符串,默認不填
          c_time = models.DateTimeField(verbose_name='建立時間',auto_now_add=True)   #建立時間,自動記錄當前時間
              def __str__(self):
                  return '%s-%s' % (self.name,self.age)

    激活模型

  • 在項目中註冊app
    • 在settings.py的INSTALLED_APPS中註冊
  • 運行數據庫遷移命令(在項目根目錄下)
    python manage.py makemigrations students#若是不加students,settings.py的INSTALLED_APPS中全部的app都會遷移
    • 告訴django咱們作了哪些數據庫的修改
      數據庫遷移文件見下圖的0001_initial.py,再修改就會多個0002
      在這裏插入圖片描述
    • python manage.py sqlmigrate students 0001能夠從遷移的地方獲取sql語句,效果見下圖
      在這裏插入圖片描述
    • 表名:appname_模型name(小寫的),如students_student
    • django會自動建立主鍵,通常取名爲id
  • 此時數據庫中尚未表,須要運行migrate命令使遷移生效工具

    python manage.py migrate students
    在這裏插入圖片描述
    • 要修改數據庫,都要修改模型,而後運行數據庫遷移命令,再運行使遷移生效命令

      數據的增刪改查

  • django shell調試工具

    python manage.py shell
  • 導入模型

    from students.models import Student

    In [2]: Student.objects #模型管理器,每一個模型都有一個管理器,經過管理器操做模型
    Out[2]: <django.db.models.manager.Manager at 0x7f7b39787b00>
    In [3]: Student.objects.all()
    Out[3]: <QuerySet [ ]> #查詢集
    In [4]: s1 = Student(name='xiaoge',age=16,qq='234552') #增方法1
    In [5]: Student.objects.all()
    Out[5]: <QuerySet []> #此時尚未寫進數據庫
    In [6]: s1.save() #通過這步才寫進數據庫
    In [7]: Student.objects.all()
    Out[7]: <QuerySet [<Student: Student object (1)>]>
    In [11]: s2 = Student() #增方法2 11-14步 依次添加
    In [12]: s2.name = 'na'
    In [13]: s2.age = 17
    In [14]: s2.save()
    In [2]: Student.objects.all()
    Out[2]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>]>
    In [3]: s = Student.objects.get(id=1) #單條數據查看
    In [4]: s.name
    Out[4]: 'xiaoge'
    In [5]: s.c_time
    Out[5]: datetime.datetime(2019, 2, 24, 2, 6, 32, 247014, tzinfo= )
    In [6]: print(s.c_time)
    2019-02-24 02:06:32.247014+00:00
    In [7]: Student.objects.create(name='wen',age=25) #增方法3
    Out[7]: <Student: wen-25>
    In [8]: Student.objects.all()
    Out[8]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>]>
    In [9]: s = Student.objects.get_or_create(name='yi') #增方法4 查找或建立
    In [10]: s
    Out[10]: (<Student: yi-0>, True) #以前沒有,新建成功 #返回元組
    In [11]: s = Student.objects.get_or_create(name='wen')
    In [12]: s
    Out[12]: (<Student: wen-25>, False) #以前有,查到的,沒新建
    In [13]: s[0].name
    Out[13]: 'wen'
    In [14]: s[0].id
    Out[14]: 3
  • 在mysql中查看錶
    select * from students_student;
    在這裏插入圖片描述
    • 存在數據庫裏的時間(c_time)是UTC時間,取出時自動轉換設置的時區

  • Student.objects.all()
  • Student.objects.get(pk=1)
  • Student.objects.filter(sex=1)

    In [16]: res = Student.objects.all()     #查1        這時不會操做數據庫
      In [15]: Student.objects.all()      #這時查全部數據,返回QuerySet(查詢集)                                                                                                    
      Out[15]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>, <Student: yi-0>]>        QuerySet是惰性的
      In [17]: print(res.query)      #Student.objects.all()背後執行的sql語句                                                                                                        
      SELECT `students_student`.`id`, `students_student`.`name`, `students_student`.`age`, `students_student`.`sex`, `students_student`.`qq`, `students_student`.`phone`, `students_student`.`c_time` FROM `students_student` #select * from students_student
      In [18]: res       #查1   結合16步     返回一個查詢集,能夠for循環,迭代,切片                                                                                                                    
      Out[18]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>, <Student: yi-0>]>
      In [19]: print(res[1:2].query)      #切片                                                                                                   
      SELECT `students_student`.`id`, `students_student`.`name`, `students_student`.`age`, `students_student`.`sex`, `students_student`.`qq`, `students_student`.`phone`, `students_student`.`c_time` FROM `students_student`  LIMIT 1 OFFSET 1
      In [20]: Student.objects.get(id=1)        # 查2    返回查詢對象                                                                                             
      Out[20]: <Student: xiaoge-16>
      In [21]: Student.objects.get(name='yi')     #get通常和主鍵對應                                                                                               
      Out[21]: <Student: yi-0>
      In [23]: Student.objects.get(pk=1)      #pk即主鍵,防止查錯主鍵名                                                                                                   
      Out[23]: <Student: xiaoge-16>
      In [25]: res = Student.objects.filter(sex=1)    #查3 篩選                                                                                       
      In [26]: res                                                                                                                           
      Out[26]: <QuerySet [<Student: xiaoge-16>, <Student: na-17>, <Student: wen-25>, <Student: yi-0>]>
      In [28]: print(res.query)                                                                                                              
      SELECT `students_student`.`id`, `students_student`.`name`, `students_student`.`age`, `students_student`.`sex`, `students_student`.`qq`, `students_student`.`phone`, `students_student`.`c_time` FROM `students_student` WHERE `students_student`.`sex` = 1

    當get匹配到多條數據時,會報錯
    在這裏插入圖片描述

    In [30]: s = Student.objects.get(name='xiaoge')
    In [31]: s
    Out[31]: <Student: xiaoge-16>
    In [32]: s.age = 15 #改方法1 改一條數據
    In [33]: s.save()
    In [34]: Student.objects.get(pk=1)
    Out[34]: <Student: xiaoge-15>
    In [35]: Student.objects.filter(name='yi').update(age=19) #改方法2 能夠改多條數據
    Out[35]: 1 #成功返回1
    In [36]: Student.objects.get(name='yi')
    Out[36]: <Student: yi-19>

    In [38]: s = Student.objects.get(id=2) #刪一條 38-40步 In [39]: s Out[39]: <Student: na-17> In [40]: s.delete() Out[40]: (1, {'students.Student': 1}) In [41]: Student.objects.filter(gender=1).delete() #能夠刪多條 In [42]: Student.objects.filter(sex=1).delete() Out[42]: (3, {'students.Student': 3})

相關文章
相關標籤/搜索