<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Django -- 單表操作

      ORM簡介

      1, ORM是 對象--關系--映射 的簡稱.實現了數據模型與數據庫的解耦,即數據庫的設計不需要依賴特定的數據庫,通過簡單的配置就可以輕松更換數據庫

      2, 類對象 --> sql --> pymysql --> mysql服務端 --> 磁盤,orm其實就是將類對象的語法翻譯成sql語句的一個引擎

       

      建表操作

      1, 創建表

      # app 應用下的 models.py 文件中寫
      from django.db import models
      class UserInfo(models.Model):  # UserInfo 為表名
          id = models.AutoField(primary_key=True)
          name = models.CharField(max_length=10)
          age = models.IntegerField()
          current_date = models.DateField()

       

      2, 更多字段和參數

      字段

      <1> CharField
              字符串字段, 用于較短的字符串.
              CharField 要求必須有一個參數 max_length, 用于從數據庫層和Django校驗層限制該字段所允許的最大字符數.
       
      <2> IntegerField
             用于保存一個整數.
       
      <3> DecimalField
              一個浮點數. 必須 提供兩個參數:
              
      <4> AutoField
              一個 IntegerField, 添加記錄時它會自動增長. 你通常不需要直接使用這個字段;
              自定義一個主鍵:my_id=models.AutoField(primary_key=True)
              如果你不指定主鍵的話,系統會自動添加一個主鍵字段到你的 model.
      View Code

       

      參數

      (1)null
       
      如果為True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False.
       
      (1)blank
       
      如果為True,該字段允許不填。默認為False。
      要注意,這與 null 不同。null純粹是數據庫范疇的,而 blank 是數據驗證范疇的。
      如果一個字段的blank=True,表單的驗證將允許該字段是空值。如果字段的blank=False,該字段就是必填的。
       
      (2)default
       
      字段的默認值。可以是一個值或者可調用對象。如果可調用 ,每有新對象被創建它都會被調用,如果你的字段沒有設置可以為空,那么將來如果我們后添加一個字段,這個字段就要給一個default值
       
      (3)primary_key
       
      如果為True,那么這個字段就是模型的主鍵。如果你沒有指定任何一個字段的primary_key=True,
      Django 就會自動添加一個IntegerField字段做為主鍵,所以除非你想覆蓋默認的主鍵行為,
      否則沒必要設置任何一個字段的primary_key=True。
       
      (4)unique
       
      如果該值設置為 True, 這個數據字段的值在整張表中必須是唯一的
       
      (5)choices
      由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 如果設置了choices ,默認的表單將是一個選擇框而不是標準的文本框,<br>而且這個選擇框的選項就是choices 中的選項。
      (6)db_index
        如果db_index=True 則代表著為此字段設置數據庫索引。
      ?
      DatetimeField、DateField、TimeField這個三個時間字段,都可以設置如下屬性。
      ?
      (7)auto_now_add
          配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。
      ?
      (8)auto_now
          配置上auto_now=True,每次更新數據記錄的時候會更新該字段,標識這條記錄最后一次的修改時間
      View Code 

      3, settings配置

      若想將模型轉為mysql數據庫中的表,需要在 settings.py 中配置:

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME':'庫名',   
              'USER':'root',   
              'PASSWORD':'666',
              'HOST':'127.0.0.1',  
              'PORT':3306 
          }
      }
      ?
      # 打印sql語句
      LOGGING = {
          'version': 1,
          'disable_existing_loggers': False,
          'handlers': {
              'console':{
                  'level':'DEBUG',
                  'class':'logging.StreamHandler',
              },
          },
          'loggers': {
              'django.db.backends': {
                  'handlers': ['console'],
                  'propagate': True,
                  'level':'DEBUG',
              },
          }
      }
      View Code

       

      項目文件夾下的 init.py文件中,寫下面兩句

      import pymysql
      pymysql.install_as_MySQLdb()

       

      執行數據庫同步指令

      python manage.py makemigrations  # 生成記錄,每次修改了models里面的內容或者添加了新的app,新的app里面寫了models里面的內容,都要執行這兩條
      ?
      python manage.py migrate     # 執行上面這個語句的記錄來創建表,生成的表名字前面會自帶應用的名字,例如:你的book表在mysql里面叫做app01_book表

       

      增加數據

      已建好的表數據(model.py) :

      from django.db import models
      ?
      class Data(models.Model):
          name = models.CharField(max_length=10)
          age = models.IntegerField()
          current_data = models.DateField()
      ?
          def __str__(self):
               return self.name

       

      1, 創建方式一:

      from app import models
      student_obj = models.Data(
          name = 'alex',
          age = 73,
          current_data= '2008-08-08'
      )
      student_obj.save()

       

      2, 創建方式二(常用此創建):

      from app import models
      new_obj = models.Data.objects.create(
          name = 'wusir',
          age = 83,
          current_data= '2008-08-15',
      )
      ?
      print(new_obj)   # Data object --> model對象
      print(new_obj.name,new_obj.age)  # .屬性  可以獲取對應字段的數據

       

      3, 創建方式三

      from app import models
      lis = []
      for i in range(10):
          obj = models.Data(
              name = 'xin',
              age = 18,
              current_data= '2010-10-10'
          )
          lis.append(obj)
          models.Data.objects.bulk_create(lis)   # 批量插入,速度快

       

      4, 創建方式四: update_or_create 有就更新,沒有就創建

      from app import models
      models.Data.objects.update_or_create(
          name = 'taibai',   # 有就更新
          defaults={'age':89,'current_data':'2011-11-11'}
      ?
          name = 'xuefei',   # 沒有就創建
          defaults={'age':18,'current_data':'2000-08-08'}
      ) 

      查詢數據

      1, 簡單查詢

      # all() 查詢所有的數據,返回的是queryset集合
          all_objs = models.Data.objects.all()
          print(all_objs)
          for i in all_objs:
              print(i.name)   # 拿到每一個名字
      ?
      # 條件查詢: filter()方法, 返回的也是queryset集合,查詢不到內容不會報錯,返回一個<QuerySet []>空的queryset
          objs = models.Data.objects.filter(id=15)
          print(objs[0].name,objs[1].age)  # 通過索引.字段取值
      ?
          objs = models.Data.objects.filter(id=1,name='alex').update(name='eva',age=20)
          print(objs)
      ?
          打散的形式傳參
          objs = models.Data.objects.filter(**{'id':15,'name':'xuefei'})
          print(objs)
      ?
      # 條件查詢 : get()方法,返回的是model對象,而且get方法有且必須只有一個結果
          objs = models.Data.objects.get(id=15)  
          print(objs)
          查詢的數據不存在會報錯,得到的結果有兩個時會報錯
      ?
      # exclude(**kwargs):排除的意思,包含了與所給篩選條件不匹配的對象,沒有不等于操作, objects控制器和queryset集合都可以調用,返回值是queryset類型.
          ex = models.Data.objects.exclude(name='xin')
          ex = models.Data.objects.all().exclude(name='xin')
          print(ex)
      ?
      # order_by(): queryset類型的數據來調用,查詢結果進行排序,默認是按照id的升序排序的,返回值還是queryset類型,在字段前面加個 - 號,就是降序排序
          ord = models.Data.objects.order_by('-age','id') # 多條件排序,按照age進行降序,age相同的按照id升序排序
          print(ord)
      ?
      # reverse() : queryset類型的數據來調用,對查詢結果反向排序,返回值還是queryset類型
          rev = models.Data.objects.order_by('id').reverse()
          print(rev)
      ?
      # count() : queryset類型的數據來調用,返回數據庫中匹配查詢(QuerySet)的對象數量。
          con = models.Data.objects.all().count()
          print(con)
      ?
      # first() : queryset類型的數據來調用,返回第一條記錄,得到的都是model對象
          obj = models.Data.objects.all().first()
          print(obj)
      ?
      # last(): queryset類型的數據來調用,返回最后一條記錄,結果為model對象類型
          obj = models.Data.objects.all().last()
          print(obj)
      ?
      # exists() : queryset類型的數據來調用,如果QuerySet包含數據,就返回True,否則返回False,空的queryset類型數據也有布爾值True和False,但是一般不用它來判斷數據庫里面是不是有數據,如果有大量的數據,你用它來判斷,那么就需要查詢出所有的數據,效率太差了,用count或者exits
      ?
      # values(*field) : 用的比較多,queryset類型的數據來調用,返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的并不是一系列,model的實例化對象,而是一個可迭代的字典序列,只要是返回的queryset類型,就可以繼續鏈式調用queryset類型的其他的查找方法,其他方法也是一樣的。
      # values_list(*field):   它與values()非常相似,它返回的是一個元組序列
          obj = models.Data.objects.all().filter(age=16).values('name','age')
          print(obj)
          obj = models.Data.objects.all().filter(age=16).values_list('name','age')
          print(obj)
      ?
      # distinct(): values和values_list得到的queryset類型的數據來調用,從返回結果中剔除重復紀錄,結果還是queryset
          query = models.Data.objects.all().values('age').distinct()
          print(query)
      View Code

       

      2, 基于雙下劃線的模糊查詢 

      mes = models.Data.objects.filter(price__in=[100,200,300]) # price值等于這三個里面的任意一個的對象
      ?
      mes = models.Data.objects.filter(price__gt=100)  # 大于,大于等于是price__gte=100,別寫price>100,這種參數不支持
      ?
      mes = models.Data.objects.filter(price__lt=100) # 小于
      ?
      mes = models.Data.objects.filter(price__range=[100,200])  # sql的between and,大于等于100,小于等于200
      ?
      mes = models.Data.objects.filter(title__contains="python")  #title值中包含python的
      ?
      mes = models.Data.objects.filter(title__icontains="python") #不區分大小寫
      ?
      mes = models.Data.objects.filter(title__startswith="py") #以什么開頭,istartswith  不區分大小寫
      ?
      all_books = models.Book.objects.filter(pub_date__year=2012) #找2012年的所有書籍
      ?
      all_books = models.Book.objects.filter(pub_date__year__gt=2012) # 找大于2012年的所有書籍
      ?
      all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2) #找2019年月份的所有書籍
      View Code

       

      刪除數據

      delete  queryset 和model對象都可以調用
      ?
      models.Student.objects.get(id=3).delete()  # model對象來調用的delete方法
      models.Student.objects.filter(name='Alex').delete()
      models.Student.objects.all().delete()  # 刪除所有

       

      更改數據

      model對象不能調用更新方法 報錯信息'Student' object has no attribute 'update'
      只能queryset調用
      ?
      models.Student.objects.get(name='alex').update(age=38)  # 報錯
      models.Student.objects.filter(name='alex').update(age=38)

       

       

       

       

       

       

       

      posted @ 2019-07-28 16:50  未來&你好  閱讀(218)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 视频一区视频二区制服丝袜| 欧美丰满熟妇乱XXXXX网站| 久久青草国产精品一区| 国产精品一区二区三区黄| 69天堂人成无码免费视频| 国内精品卡一卡二卡三| 国产精品国产三级国产专i| 国产蜜臀久久av一区二区| 国内精品久久人妻无码网站| 国产中文字幕在线一区| 一区二区三区日本久久九| 玩弄放荡人妻少妇系列| 男女性高爱潮免费网站| 潘金莲高清dvd碟片| 亚洲一区二区视频在线观看| 国产一区视频一区欧美| 欧美三级中文字幕在线观看| 97精品伊人久久久大香线蕉| 成人3D动漫一区二区三区| 广东省| 国产精品一区二区久久毛片| 国产精品美女久久久久久麻豆| 五峰| 亚洲成在人天堂一区二区| 激情综合网激情五月我去也| 国产三级精品三级在线区| 综合色一色综合久久网| 国产99在线 | 欧美| 洞口县| 97久久综合亚洲色hezyo| 国产精品制服丝袜无码| 午夜福利视频| 无码人妻aⅴ一区二区三区69岛| 亚洲熟少妇在线播放999| 国产亚洲AV电影院之毛片| 亚洲狠狠婷婷综合久久久| 国产乱子伦一区二区三区视频播放| 国产专区一va亚洲v天堂| 亚洲高清WWW色好看美女| 50岁熟妇的呻吟声对白| 黑人巨大无码中文字幕无码|