Django學習筆記二

Django學習筆記二

一 字段屬性和選項

1.1 模型類屬性命名限制

1)不能是python的保留關鍵字。
2)不容許使用連續的下劃線,這是由django的查詢方式決定的。
3)定義屬性時須要指定字段類型,經過字段類型的參數指定選項,語法以下:
屬性名=models.字段類型(選項)javascript

1.2 字段的類型

使用時須要引入django.db.models包,字段類型以下:html

類型 描述
AutoField 自動增加的IntegerField,一般不用指定,不指定時Django會自動建立屬性名爲id的自動增加屬性。
BooleanField 布爾字段,值爲True或False。
NullBooleanField 支持Null、True、False三種值。
CharField(max_length=最大長度) 字符串。參數max_length表示最大字符個數。
TextField 大文本字段,通常超過4000個字符時使用。
IntegerField 整數
DecimalField(max_digits=None, decimal_places=None) 十進制浮點數。參數max_digits表示總位。參數decimal_places表示小數位數。
FloatField 浮點數。參數同上
DateField:([auto_now=False, auto_now_add=False]) 日期。1)參數auto_now表示每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,它老是使用當前日期,默認爲false。2) 參數auto_now_add表示當對象第一次被建立時自動設置當前時間,用於建立的時間戳,它老是使用當前日期,默認爲false。3)參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。
TimeField 時間,參數同DateField。
DateTimeField 日期時間,參數同DateField。
FileField 上傳文件字段。
ImageField 繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片

對比:null是數據庫範疇的概念,blank是後臺管理頁面表單驗證範疇的。
經驗:
當修改模型類以後,若是添加的選項不影響表的結構,則不須要從新作遷移,商品的選項中default和blank不影響表結構。
參考文檔:
http://python.usyiyi.cn/translate/django_182/index.htmljava

1.3 選項

經過選項實現對字段的約束,選項以下:python

選項名 描述
default 默認值。設置默認值。
primary_key 若爲True,則該字段會成爲模型的主鍵字段,默認值是False,通常做爲AutoField的選項使用。
unique 若是爲True, 這個字段在表中必須有惟一值,默認值是False。
db_index 若值爲True, 則在表中會爲此字段建立索引,默認值是False。
db_column 字段的名稱,若是未指定,則使用屬性的名稱。
null 若是爲True,表示容許爲空,默認值是False。
blank 若是爲True,則該字段容許爲空白,默認值是False。

對比:null是數據庫範疇的概念,blank是後臺管理頁面表單驗證範疇的。
經驗:
當修改模型類以後,若是添加的選項不影響表的結構,則不須要從新作遷移,商品的選項中default和blank不影響表結構。
參考文檔:
http://python.usyiyi.cn/translate/django_182/index.htmlmysql

class BookInfo(models.Model): '''圖書模型類''' # 圖書名稱 btitle = models.CharField(max_length=20, db_column='title') # 圖書名字惟一 # btitle = models.CharField(max_length=20, unique=True, db_index=True) # 價格,最大位數爲10,小數爲2 # bprice = models.DecimalField(max_digits=10, decimal_places=2) # 出版日期 bpub_date = models.DateField() # bpub_date = models.DateField(auto_now_add=True) # 建立時間 # bpub_date = models.DateField(auto_now=True) # 更新時間 # 閱讀量 bread = models.IntegerField(default=0) # 評論量 bcomment = models.IntegerField(default=0) # 刪除標記 isDelete = models.BooleanField(default=False) # book = models.Manager() # 自定一個Manager類對象,管理器對象 objects = BookInfoManager() # 自定義一個BookInfoManager類的對象 # @classmethod # def create_book(cls, btitle, bpub_date): # '''添加一本圖書''' # # 建立一個cls類的對象 # obj = cls() # obj.btitle = btitle # obj.bpub_date = bpub_date # # 添加進數據庫 # obj.save() # # 返回obj # return obj class Meta: db_table = 'bookinfo' # 指定模型類對應表名 

二查詢

2.1 mysql的查詢日誌

mysql.log是mysql的日誌文件,裏面記錄的對MySQL數據庫的操做記錄。默認狀況下mysql的日誌文件沒有產生,須要修改mysql的配置文件,步驟以下:
1)使用下面的命令打開mysql的配置文件,去除68,69行的註釋,而後保存。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2)重啓mysql服務,就會產生mysql日誌文件。
sudo service mysql restart
3)打開MySQL的日誌文件。
/var/log/mysql/mysql.log 是mysql日誌文件所在的位置。
使用下面的命令能夠實時查看mysql的日誌文件:
sudo tail -f /var/log/mysql/mysql.loggit

2.2 查詢函數

經過模型類.objects屬性能夠調用以下函數,實現對模型類對應的數據表的查詢。web

函數名 功能 返回值 說明
get 返回表中知足條件的一條且只能有一條數據。 返回值是一個模型類對象。 參數中寫查詢條件。1) 若是查到多條數據,則拋異常MultipleObjectsReturned 2)查詢不到數據,則拋異常:DoesNotExist。
all 返回模型類對應表格中的全部數據 返回值是QuerySet類型 查詢集
filter 返回知足條件的數據 返回值是QuerySet類型 參數寫查詢條件。
exclude 返回不知足條件的數據 返回值是QuerySet類型 參數寫查詢條件
order_by 對查詢結果進行排序 返回值是QuerySet類型 參數中寫根據哪些字段進行排序

get示例:
例:查詢圖書id爲3的圖書信息。
all方法示例:
例:查詢圖書全部信息。
filter方法示例:
條件格式:
模型類屬性名__條件名=值
查詢圖書評論量爲34的圖書的信息:
a)判等 條件名:exact。
例:查詢編號爲1的圖書。sql

BookInfo.objects.get(id=1)

b)模糊查詢
例:查詢書名包含'傳'的圖書。contains數據庫

BookInfo.objects.filter(btitle__contains='傳')

例:查詢書名以'部'結尾的圖書 endswith 開頭:startswithdjango

BookInfo.objects.filter(btitle__endswith='部')

c)空查詢 isnull
例:查詢書名不爲空的圖書。isnull

select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)範圍查詢 in
例:查詢id爲1或3或5的圖書。

select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比較查詢 gt(greate than) lt(less than) gte(equal) 大於等於
lte 小於等於
例:查詢id大於3的圖書。

Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查詢
例:查詢1980年發表的圖書。

BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1往後發表的圖書。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查詢id不爲3的圖書信息。

BookInfo.objects.exclude(id=3)

order_by方法示例:
做用:進行查詢結果進行排序。
例:查詢全部圖書的信息,按照id從小到大進行排序。

BookInfo.objects.all().order_by('id')

例:查詢全部圖書的信息,按照id從大到小進行排序。

BookInfo.objects.all().order_by('-id')

例:把id大於3的圖書信息按閱讀量從大到小排序顯示。

BookInfo.objects.filter(id__gt=3).order_by('-bread')

三 F和Q對象

F對象的做用:用於類屬性之間的比較
使用以前須要先導入:

from django.db.models import F

例:查詢圖書閱讀量大於評論量圖書信息。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查詢圖書閱讀量大於2倍評論量圖書信息。

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

Q對象的做用:用於查詢時條件之間的邏輯關係。not and or,能夠對Q對象進行&|~操做。
使用以前須要先導入:

from django.db.models import Q

例:查詢id大於3且閱讀量大於30的圖書的信息。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查詢id大於3或者閱讀量大於30的圖書的信息。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查詢id不等於3圖書的信息。

BookInfo.objects.filter(~Q(id=3))

四 聚合函數

做用:對查詢結果進行聚合操做。
sum count avg max min
aggregate:調用這個函數來使用聚合。 返回值是一個字典
使用前需先導入聚合類:

from django.db.models import Sum,Count,Max,Min,Avg

例:查詢全部圖書的數目。

BookInfo.objects.all().aggregate(Count('id'))

{'id__count': 5}
例:查詢全部圖書閱讀量的總和。

BookInfo.objects.aggregate(Sum('bread'))

{'bread__sum': 126}
count函數 返回值是一個數字
做用:統計知足條件數據的數目。
例:統計全部圖書的數目。

BookInfo.objects.all().count()
BookInfo.objects.count()

例:統計id大於3的全部圖書的數目。

BookInfo.objects.filter(id__gt=3).count()

小結:
enter description here

參考文檔:
http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html

五 查詢集

all, filter, exclude, order_by調用這些函數會產生一個查詢集,QuerySet類對象能夠繼續調用上面的全部函數。
5.1 查詢集特性
1) 惰性查詢:只有在實際使用查詢集中的數據的時候纔會發生對數據庫的真正查詢。
2) 緩存:當使用的是同一個查詢集時,第一次使用的時候會發生實際數據庫的查詢,而後把結果緩存起來,以後再使用這個查詢集時,使用的是緩存中的結果。
5.2 限制查詢集
能夠對一個查詢集進行取下標或者切片操做來限制查詢集的結果。
對一個查詢集進行切片操做會產生一個新的查詢集,下標不容許爲負數。
取出查詢集第一條數據的兩種方式:

方式 說明
b[0] 若是b[0]不存在,會拋出IndexError異常
b[0:1].get() 若是b[0:1].get()不存在,會拋出DoesNotExist異常。

exists:判斷一個查詢集中是否有數據。True False

六 模型類的關係

1) 一對多關係
例:圖書類-英雄類
models.ForeignKey() 定義在多的類中。
2) 多對多關係
例:新聞類-新聞類型類 體育新聞 國際新聞
models.ManyToManyField() 定義在哪一個類中均可以。
3) 一對一關係
例:員工基本信息類-員工詳細信息類. 員工工號
models.OneToOneField定義在哪一個類中均可以。
'''

# 新聞類型類
class NewsType(models.Model):
    # 類型名
    type_name = models.CharField(max_length=20)
    # 關係屬性,表明類型下面的信息
    type_news = models.ManyToManyField('NewsInfo')

# 新聞類
class NewsInfo(models.Model):
    # 新聞標題
    title = models.CharField(max_length=128)
    # 發佈時間
    pub_date = models.DateTimeField(auto_now_add=True)
    # 信息內容
    content = models.TextField()
    # 關係屬性, 表明信息所屬的類型
    # news_type = models.ManyToManyField('NewsType')

七 關聯查詢(一對多)

7.1 查詢和對象關聯的數據

在一對多關係中,一對應的類咱們把它叫作一類,多對應的那個類咱們把它叫作多類,咱們把多類中定義的創建關聯的類屬性叫作關聯屬性。
例:查詢id爲1的圖書關聯的英雄的信息。

b=BookInfo.objects.get(id=1)
    b.heroinfo_set.all()

經過模型類查詢:
HeroInfo.objects.filter(hbook__id=1)
例:查詢id爲1的英雄關聯的圖書信息。

h = HeroInfo.objects.get(id=1)
    h.hbook

經過模型類查詢:

BookInfo.objects.filter(heroinfo__id=1)

格式:
enter description here

由一類的對象查詢多類的時候:
一類的對象.多類名小寫_set.all() #查詢所用數據
由多類的對象查詢一類的時候:
多類的對象.關聯屬性 #查詢多類的對象對應的一類的對象
由多類的對象查詢一類對象的id時候:
多類的對象. 關聯屬性_id

7.2 經過模型類實現關聯查詢

 

enter description here
enter description here

 

例:查詢圖書信息,要求圖書關聯的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查詢圖書信息,要求圖書中的英雄的id大於3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查詢書名爲「天龍八部」的全部英雄。
HeroInfo.objects.filter(hbook__btitle='天龍八部')
經過多類的條件查詢一類的數據:
一類名.objects.filter(多類名小寫__多類屬性名__條件名)
經過一類的條件查詢多類的數據:
多類名.objects.filter(關聯屬性__一類屬性名__條件名)

八 刪除,更新,插入,自關聯

調用一個模型類對象的save方法的時候就能夠實現對模型類對應數據表的插入和更新。
調用一個模型類對象的delete方法的時候就能夠實現對模型類對應數據表數據的刪除。
自關聯:

 

enter description here
enter description here

自關聯是一種特殊的一對多的關係。
案例:顯示廣州市的上級地區和下級地區。
地區表:id, atitle, aParent_id;
mysql終端中批量執行sql語句:source areas.sql;

 

class AreaInfo(models.Model): '''地址模型類''' # 地區名稱 atitle = models.CharField(verbose_name='標題', max_length=20)
    # 自關聯屬性
    aParent = models.ForeignKey('self', null=True, blank=True)

    def __str__(self):
        return self.atitle

    def title(self):
        return self.atitle
    title.admin_order_field = 'atitle'
    title.short_description = '地區名稱'

    def parent(self):
        if self.aParent is None:
            return ''
        return self.aParent.atitle
    parent.short_description = '父級地區名稱'

九 管理器

  1. BookInfo.objects.all()->objects是一個什麼東西呢?
    答:objects是Django幫我自動生成的管理器對象,經過這個管理器能夠實現對數據的查詢。
    objects是models.Manger類的一個對象。自定義管理器以後Django再也不幫咱們生成默認的objects管理器。

  2. 自定義模型管理器類
    1)自定義一個管理器類,這個類繼承models.Manger類。
    2)再在具體的模型類裏定義一個自定義管理器類的對象。

  3. 自定義管理器類的應用場景
    1) 改變查詢的結果集。
    好比調用BookInfo.books.all()返回的是沒有刪除的圖書的數據。
    2) 添加額外的方法。
    管理器類中定義一個方法幫咱們操做模型類對應的數據表。
    使用self.model()就能夠建立一個跟自定義管理器對應的模型類對象。

# Create your models here.
class BookInfoManager(models.Manager):
    '''圖書模型管理器類'''
    # 1.改變原有查詢的結果集
    def all(self):
        # 1.調用父類的all方法,獲取全部數據
        books = super().all() # QuerySet
        # 2.對books中的數據進行過濾
        books = books.filter(isDelete=False)
        # 返回books
        return books

    # 2.封裝方法,操做模型類對應的數據表(增刪改查)
    def create_book(self, btitle, bpub_date):
        '''添加一本圖書'''
        # 1.建立一個圖書對象
        # 獲取self所在的模型類
        model_class = self.model
        book = model_class()
        # book = BookInfo()
        book.btitle = btitle
        book.bpub_date = bpub_date
        # 2.添加進數據庫
        book.save()
        # 3.返回book
        return book

小結:

 

enter description here
enter description here
相關文章
相關標籤/搜索