Django之模型

1、Model類

  1.ORM思想python

  ORM:Object Relationship Mapping 對象關係映射mysql

  經過操做對象方法,來進行關係型數據庫操做sql

  2.實現方式 

   在setting配置文件配置數據庫    shell

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'HOST': 'localhost',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456',
    }
}

 

 

​     繼承Model類(django.db.models.Model) 數據庫

from django.db import models

# Create your models here.

class Student(models.Model):
    name = models.CharField(max_length=20)
    sex = models.CharField(max_length=10)
    score = models.FloatField()

    class Meta:  #定義表結構的信息
        db_table = 'students'

 

    模型類對應於數據庫表,類屬性 對應於表字段django

 

​         建立好模型後,遷移(同步到數據庫)緩存

 

​        1.製做遷移計劃併發

 

​       python manage.py makemigrationsapp

 

  ​     2.執行計劃任務函數

 

​       python manage.py migrate

2、操做Model

  1.概述

   咱們能夠在shell中操做相關語句,也能夠視圖函數中使用相關語句

    【如下操做都是在shell環境中執行】

   進入shell 環境

    python manage.py shell

  2.添加數據

   2.1經過模型類的對象管理器插入記錄

   語法:模型類名.objects.create(類屬性=值) 

      【此方法是直接操做數據庫】  

# 導入Student包
from myapp.models import Student
stu1 = Student.objects.create(name='aaa',sex='m',score=95.
0)

 

   2.2 實例化模型對象插入記錄

  【注意:經過對象模型進行 插入操做是在內存中執行的,須要經過save函數加載到數據庫中】

stu3 = Student(name='a',sex='m',score=89)
stu3.save()

 

   3.添加記錄

    3.1經過模型類的對象管理器插入記錄

    語法:模型類名.objects.create(類屬性=值)

    【此方法是直接操做數據庫】

# 導入Student包
from myapp.models import Student
stu1 = Student.objects.create(name='aaa',sex='m',score=95.
0)

 

     3.2實例化模型對象插入記錄

stu3 = Student(name='a',sex='m',score=89)
stu3.save()

 

    【注意:經過對象模型進行插入操做是在內存中執行的,須要經過save函數加載到數據庫中】

   3.3修改刪除操做

    修改:經過對象.屬性=新屬性值更改,而後save()進行提交

    刪除:對象.delete(),刪除對象

stu = Student.objects.get(id=1)
stu.score = 100
stu.save()


stu.delete()

 

  4.查詢操做

    4.1簡單查詢

    查詢惟一的記錄

    模型名.objects.get(查詢條件) 

1.查詢主鍵爲1的記錄
 stu = Student.objects.get(id=1)
    
get()返回一條記錄【即查詢條件爲惟一值且必須存在,通常查詢主鍵】,以模型對象表示 

 

     查詢全部記錄

     模型類名.object.all()

查詢全部:
 students1 = Student.objects.all()

返回Django的QuerySet對象,能夠被遍歷

    4.2過濾查詢

     模型類名.objects.filter(查詢條件)

s1 = Students.objects.filter(sex='m')
返回Django中的QuerySet容器,能夠被遍歷

多條件查詢,查詢條件使用,隔開表示邏輯與
s1 = Student.objects.filter(sex='m',name='aaa')

 

    4.3排除查詢

     模型類名.objects.exclude(查詢條件)

     exclude是把查詢條件以外的內容顯示出來

查詢分數小於85的學生記錄
students = Student.objects.exclude(score__gte=85)

 

    4.4 使用魔法參數查詢

字段後面跟雙下劃線"__",表示特殊查詢
經常使用的雙下劃線魔法參數有:
 __year     __month   __day   __startswith  __endswith  
__gte 大於等於
__lte 小於等於
__contains (至關於模糊查詢)
    

s1 = Student.objects.filter(name__startswith='a')    
    

 

    4.5 限制查詢【切片】

s1 = Student.objects.all()[1:3]

查詢前三個
s1 = Student.objects.all()[:3]

查詢奇數條記錄
s1 = Student.objects.all()[::2]

    4.6排序查詢

    模型類名.objects.order_by("排序字段名")

降序
s1 = Student.objects.order_by('-score')


升序
s1 = Student.objects.order_by('score')


查詢成績前三名

s1 = Student.objects.order_by('-score')[:3]

 

   4.7原生sql查詢

    模型類名.objects.raw('原生sql')

# 模糊查詢
使用原生sql查詢名字中包含a的記錄
s1 = Student.objects.raw('select * from students where nam
e like "%%a%%"')

至關於select * from students where name like "%a%"

# 使用佔位符
查詢名字爲張三,性別爲男的學生信息,使用原生sql語句

s1 = Student.objects.raw('select * from students where nam
e="%s" and sex="%s"'%('張三',''))


a='張三'
b=''
 s1 = Student.objects.raw('select * from students where na
me="{a}" and sex="{b}"')


s1 = Student.objects.raw('select * from students where nam
e=%s and sex=%s',['張三',''])

 

    4.8Q查詢

    對於複雜組合查詢條件,使用Q查詢很方便

    經過實例化Q對象,將Q對象傳遞到filter()、get()方法中能夠組合出多種查詢條件

    Q查詢依賴於Q對象(from django.db.models import Q)

    Q對象之間可使用&、|。在Q對象前加~表示Q封裝條件的否認條件

查詢男生中90分以上的學生記錄
from django.db.models import Q
q1 = Q(sex='')
q2 = Q(score__gte=90)
 s1 = Student.objects.filter(q1&q2)

& :邏輯與
|   :邏輯或
~ :邏輯非

 

    4.9 F查詢

    F()對象生成一個SQL表達式,來描述數據庫層級所須要的操做,與更新操做相關

描述數據庫層級的操做,而不是內存層級的操做
即,能夠直接操做數據庫中的數據,而不是先更改緩存,再上傳數據庫

解決併發性問題

使用F對象更新學生成績,將1號學生成績在原有基礎上+5分

from django.db.models import F
s1 = Student.objects.get(id=1)
s1.score = F('score')+5
s1.save()

    4.10 聚合查詢

    aggregate(*args,**kwargs)

    可能要導入的:from django.db.models import Min,Avg,Max,Sum,Count

查詢全部學生的平均成績
from django.db.models import Avg,Max,Min,Count,Sum

avg = Student.objects.aggregate(Avg('score'))

avg = Student.objects.all().aggregate(as=Avg('score'))

as 是avg對象的別名

查詢結果是一個字典 

     4.11分組查詢

      annotate(*args,**kwargs)

根據性別查詢不一樣性別的平均值
 s1 = Student.objects.values('sex').annotate(Avg('score'))

    
.values()方法能夠顯示對象中某個屬性的值,以字典形式存儲    
相關文章
相關標籤/搜索