溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django基礎(chǔ)-2:Django常用配置及ORM

發(fā)布時(shí)間:2020-07-23 08:11:38 來(lái)源:網(wǎng)絡(luò) 閱讀:597 作者:小生博客 欄目:開(kāi)發(fā)技術(shù)

小生博客:http://xsboke.blog.51cto.com

                        -------謝謝您的參考,如有疑問(wèn),歡迎交流

本次主要收集了在django中經(jīng)常使用到的配置.便于大家查詢

目錄:

  1. 漢化admin,時(shí)間格式化,指定statics.
  2. 注冊(cè)models,自定義admin.
  3. 初始化models,創(chuàng)建超級(jí)用戶.
  4. ORM.
  5. ORM的使用

一. 常用配置

  1. 漢化admin,時(shí)間格式化,指定statics.

    漢化admin,指定時(shí)區(qū)

    LANGUAGE_CODE = 'zh_Hans'
    TIME_ZONE = 'Asia/Bangkok'

    格式化時(shí)間顯示

    USE_L10N = False
    DATETIME_FORMAT = 'Y-m-d H:i:s'
    DATE_FORMAT = 'Y-m-d'

    指定static

    STATIC_URL = '/static/'
    STATICFILES_DIRS = (
    os.path.join(BASE_DIR,"statics"),
    )

  2. 注冊(cè)models,自定義admin

    from app.models import *
    admin.site.site_header = '服務(wù)器續(xù)費(fèi)信息' # 此處設(shè)置頁(yè)面顯示標(biāo)題
    admin.site.site_title = '服務(wù)器續(xù)費(fèi)信息' # 此處設(shè)置頁(yè)面頭部標(biāo)題

    @admin.register(TableName)
    class TNAdmin(admin.ModelAdmin):
    fields = ('issue','start_date','applicant','result','receiver','end_date','memo') # 設(shè)置編輯界面顯示的字段
    list_display = ('number','issue','start_date','applicant','result','receiver','end_date') # 設(shè)置在列表中顯示的字段
    search_fields = ('start_date',) #增加一個(gè)搜索欄
    empty_value_display = '未填寫' # 覆蓋空字段為短劃線
    list_per_page = 50 # 每頁(yè)顯示的行數(shù)
    ordering = ('-number',) # 設(shè)置默認(rèn)排序字段,-為降序
    list_editable = ['result',] # 設(shè)置可編輯字段
    list_display_links = ('id', 'caption') # 設(shè)置哪些字段可以點(diǎn)擊進(jìn)入編輯界面
    date_hierarchy = 'start_date' # 詳細(xì)時(shí)間分層篩選 
    list_filter = ('start_date','end_date','receiver','result') # 過(guò)濾器

  3. 初始化models,創(chuàng)建超級(jí)用戶.

    python manage.py makemigrations
    python manage.py migrate

    python manage.py createsuperuser

  4. 什么是ORM

    ORM,對(duì)象關(guān)系映射,是一個(gè)對(duì)應(yīng)關(guān)系,用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換,換言之,就是用面向?qū)ο蟮姆绞饺ゲ僮鲾?shù)據(jù)庫(kù)的創(chuàng)建表以及增刪改查等操作。

    優(yōu)點(diǎn):
    1.1 ORM使得我們的通用數(shù)據(jù)庫(kù)交互變得簡(jiǎn)單易行,而且完全不用考慮該死的SQL語(yǔ)句,快速開(kāi)發(fā),由此而來(lái)
    1.2 可以避免一些新手程序要寫sql語(yǔ)句帶來(lái)的性能問(wèn)題

    缺點(diǎn):
    1.3 性能有所犧牲,不過(guò)現(xiàn)在的各種ORM框架都在嘗試各種方法,比如緩存,延遲加載等來(lái)減輕這個(gè)問(wèn)題
    1.4 對(duì)于個(gè)別復(fù)雜查詢,ORM仍力不從心,為了解決這個(gè)問(wèn)題,ORM一般也支持寫raw sql。

二. ORM的使用

2.1 創(chuàng)建表
    創(chuàng)建單表
    創(chuàng)建關(guān)聯(lián)表:foreignkey(通過(guò)外鍵關(guān)聯(lián))
                表之間的關(guān)系:
                    一對(duì)一
                    一對(duì)多
                    多對(duì)多

2.2 創(chuàng)建單表
    # 表創(chuàng)建完之后需要生成,執(zhí)行兩條命令
    # python manage.py makemigrations
    # python manage.py migrate
    from django.db import models

    class 表名(models.Model):
        字段名 = models.字段屬性(屬性值)

        def __str__(self):      # 防止打印對(duì)象時(shí),輸出內(nèi)存地址
            return self.<要打印的變量>

            字段屬性:
                字段名 = models.CharField(max_length=64)
                        CharField           :較短的字符串
                        IntegerField        :數(shù)字
                        ForeignKey          :
                        ManyToManyField     :

    2.2.1 單表的增,建議使用create第二種
            create方式一:
                表名.object.create(
                    字段1=要插入的數(shù)據(jù)1,
                    字段2=要插入的數(shù)據(jù)2,
                    字段3=要插入的數(shù)據(jù)3,
                )

            create方法二:以字典的方式插入
                表名.object.create(**{"字段1":"數(shù)據(jù)1"})

            save方法一:
                變量=表名(字段1="數(shù)據(jù)1")
                變量.save()

            save方法二:
                變量=表名()
                變量.字段="數(shù)據(jù)1"
                變量.save()

    2.2.3 單表的刪除         
            表名.objects.filter(條件).deleter()

    2.2.3 單表的修改
            update方法:filter調(diào)用的是一個(gè)集合,效率比save高
                表名.objects.filter(條件1,條件2).update(字段=數(shù)據(jù))

            save方法(相當(dāng)于重新賦值):get調(diào)用的是一個(gè)對(duì)象
                變量 = 表名.objects.get(條件)
                變量.字段=數(shù)據(jù)
                變量.save()

    2.2.4 單表的查詢

        <1>查數(shù)據(jù)
            變量 = models.表名.objects.filter(id=2)[0]  # 取出過(guò)濾出id=2的,第一行

            filter(**kwargs)            :包含與所給篩選條件相匹配的對(duì)象

            all()                       :查詢所有結(jié)果

            變量 = models.表名.objects.filter(id=2).values("字段")
            # 返回一個(gè)列表,列表中包含字典,字典里面存放的是"字段:數(shù)據(jù)"
            # [{"字段1":"數(shù)據(jù)1"},{"字段2":"數(shù)據(jù)2"}]

        <2>查到數(shù)據(jù)后的操作,在.filter和.all的后面
            exclude(**kwargs)           :包含與所給篩選條件不匹配的對(duì)象

            order_by(*field)            :對(duì)查詢結(jié)果排序
            # 正序:   變量 = models.表名.objects.order_by("id")
            # 倒序:   變量 = models.表名.objects.order_by("-id")

            reverse()                   :對(duì)查詢結(jié)果反向排序

            distinct()                  :從返回結(jié)果中剔除重復(fù)記錄

            values_list(*field)         :與values()相似,返回一個(gè)元組序列

            count()                     :返回?cái)?shù)據(jù)庫(kù)中匹配查詢的對(duì)象數(shù)量

            first()                     :返回第一條記錄

            last()                      :返回最后一條記錄

            exists()                    :如果QuerySet包含數(shù)據(jù),就返回True,否則返回False

            惰性機(jī)制:
                表名.objects.all()或者.filter()等都只是返回一個(gè)QuerySet(查詢結(jié)果集對(duì)象),
                它并不會(huì)馬上執(zhí)行sql,而是當(dāng)調(diào)用QuerySet的時(shí)候才執(zhí)行。

            QuerySet特點(diǎn):
                1. 可迭代
                2. 可切片
                    objs = models.表名.objects.all()

                    #迭代
                        for obj in objs:
                            print("obj:",obj)

                    #切片
                        print(objs[1])
                        print(objs[1:4])
                        print(objs[::-1])

3. 多表

    3.1 一對(duì)多(ForeignKey),比如 表1:"出版社" 和 表2:"書",一個(gè)出版社可以出多本書,外鍵要放在多里面
            class 出版社表(models.Model):
                出版社名 = models.CharField(max_length=30)
                出版社地址 = models.CharField(max_length=30)

            class 書表(models.Model):
                書名 = models.CharField(max_length=30)
                出版社 = models.ForeignKey("出版社表")
                # 對(duì)于外鍵,F(xiàn)oreignKey,在數(shù)據(jù)庫(kù)中,Django會(huì)自動(dòng)將字段存為"出版社_id"

            # 當(dāng)有外鍵時(shí)需要插入數(shù)據(jù),寫為

                # 第一種插入方式

                    書表.objects.create (
                        書名 = "魯濱遜流浪記"
                        出版社_id = "1"  // 直接插入
                    )

                # 第二種插入方式       

                    pub = models.出版社表.objects.filter(id=1)  # 首先實(shí)例化一個(gè)對(duì)象
                        書表.objects.create (
                            書名 = "魯濱遜流浪記"
                            出版社 = pub[0]  # 然后插入
                        )

    3.2 多對(duì)多(ManyToManyField)
        比如作者和書,一個(gè)作者可以寫作本書,一本書可以由多個(gè)作者完成,這時(shí)候外鍵放哪都行

            class 書表(models.Model):
                書名 = models.CharField(max_length=30)
                作者 = models.ManyToManyField("作者表")  # 自動(dòng)創(chuàng)建第三張表

            class 作者表(models.Model):
                作者名 = models.CharField(max_length=64)

        這時(shí)候會(huì)產(chǎn)生一個(gè)表,結(jié)構(gòu)為:
            id      書表_id       作者表_id
             1         5           4
             2         5           1
             3         5           2
             4         6           1
             5         6           1

        插入數(shù)據(jù)的方法:
            # 給一本書添加兩個(gè)作者

            作者1 = models.作者表.objects.get(id=3)
            作者1 = models.作者表.objects.get(id=4)

            書表 = models.書表.objects.filter(id=3)[0]

            # 一下三種方式都可
                書表.作者.add(作者1,作者2)

                書表.作者.add(作者1)
                書表.作者.add(作者2)

                書表.作者.add(*[作者1,作者2])

                執(zhí)行完之后。映射表的內(nèi)容為:
                    id      書表_id       作者表_id
                    1           3           3
                    2           3           4

        第三張表可以自己創(chuàng)建:
            class 書表(models.Model):
                書名 = models.CharField(max_length=30)
                作者 = models.ManyToManyField("作者表")  # 自動(dòng)創(chuàng)建第三張表

            class 作者表(models.Model):
                作者名 = models.CharField(max_length=64)

            class 第三張表(models.Model):
                書 = models.ForeignKey(書表)
                作者 = models.ForeignKey(作者表)

                class Meta:                        # 定義表的相關(guān)屬性
                    unique_together=["書","作者"]  # 聯(lián)合唯一,根據(jù)需求定義

                   id         書_id       作者_(dá)id
                    1           3           3    # 為了避免這種情況出現(xiàn),表在創(chuàng)建的時(shí)候要做一個(gè)聯(lián)合唯一的屬性
                    2           3           3    # 為了避免這種情況出現(xiàn),表在創(chuàng)建的時(shí)候要做一個(gè)聯(lián)合唯一的屬性
                    3           3           4               

    3.3 一對(duì)一
        OneToOne:一個(gè)通過(guò)兩個(gè)Foreignkey,unqiue=True

4. 查詢
    4.1 對(duì)象查詢
        通過(guò)將查詢到的數(shù)據(jù)賦予給一個(gè)變量,這就叫對(duì)象查詢

        4.1.1 正向查找
            # 需求:找到書所在出版社的城市,其中書是一個(gè)表,出版社是一個(gè)表,出版社里面包括城市
            # 其中,書表外鍵到了出版社表
            obj = models.書表.objects.filter(書名="魯濱遜流浪記")[0]
            obj.外鍵.城市       # 可以通過(guò)外鍵,調(diào)用另一個(gè)表的字段

        4.1.2 反向查找
            # 現(xiàn)在有一個(gè)出版社表,一個(gè)書表,外鍵在書表
            # 現(xiàn)在需要將某個(gè)出版社出版的所有的書輸出
            obj = models.出版社表.objects.filter(name="人民出版社")
            obj.書表_set.all().values("書名")       # 通過(guò) "表名_set" 這種格式反向查找

    4.2 雙下劃線之單表?xiàng)l件查詢

        models.表1.objects.filter(id__lt=10,id__gt=1)  # 獲取id大于1且小于10的值
        models.表1.objects.filter(id__in=[11,22,33])   # 獲取id等于11/22/33的數(shù)據(jù)
        models.表1.objects.exclude(id_in=[11,22,33])   # 不等于

        models.表1.objects.filter(name__contains="ven")   # 與sql的模糊查詢類似
        models.表1.objects.filter(name__icontains="ven")  # icontains大小寫不敏感

        models.表1.objects.filter(id__range=[1,2])        # 范圍,bettwen and

        startswith(以什么開(kāi)頭)、istartwith、endswith(以什么結(jié)尾)、iendwith

    4.3 雙下劃線之關(guān)聯(lián)表查詢
        # 把所有書名叫魯濱遜流浪記的出版社打印
        models.出版社表.objects.filter(書表__書名="魯濱遜流浪記").vaules("出版社名").distinct()

        # 打印人民出版社出版的書
        models.書表.objects.filter(出版社表__出版社名="人民出版社").values("書名")

        # 打印出,出版魯濱遜流浪記的出版社
        models.書表.objects.filter(書表__書名="魯濱遜流浪記").values("外鍵__出版社名")

    4.4 聚合查詢和分組查詢,是一種聚合函數(shù)

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

        Avg,Min,Sum,Max 是聚合方法

        <1> 聚合查詢
            在最后查詢的結(jié)果集上進(jìn)行操作,只有一個(gè)結(jié)果
            aggregate(*args,**kwargs)

            # 作者wangyi發(fā)表的書價(jià)格的一個(gè)平均值
                書表.objects.all().aggregate(Avg('價(jià)格'))

        <2> 分組查詢
            先根據(jù)條件把所有的結(jié)果進(jìn)行一個(gè)分組,然后對(duì)每一個(gè)結(jié)果進(jìn)行操作
            annotate(*args,**kwargs) 

            # 查詢每一個(gè)作者出的書價(jià)格的總價(jià)格
                書表.objects.values("作者表__作者名").annotate(Sum("price"))

    4.5 F查詢和Q查詢

        4.5.1 F 查詢,使用查詢條件的值,專門取對(duì)象中某列值的操作
            from django.db.models import F,Q
            # 給每本書增加20塊錢

                models.書表.objects.all().update(價(jià)格=F('價(jià)格')+20)  # 只支持?jǐn)?shù)字

        4.5.2 Q 查詢,用于封裝關(guān)鍵字查詢
            之前的查詢都是單關(guān)鍵字查詢,也有用過(guò)雙關(guān)鍵字,但是是用逗號(hào)分隔,代表and;
            可是如果我想用或呢,或者我想用or里面包括and,例如:  a and (b or (d and e))

            from django.db.models import F,Q

            如果這樣寫,這兩個(gè)語(yǔ)句的結(jié)果都是一樣的:
                        obj = models.書表.objects.filter(id=3)[0]     
                        obj = models.書表.objects.filter(Q(id=3))[0]

            示例Q查詢的多關(guān)鍵字查詢

                obj = models.書表.objects.filter( Q(id=3) | Q(書名="魯濱遜流浪記") )  #  使用管道符"|"實(shí)現(xiàn)or方法

                obj = models.書表.objects.filter( Q(價(jià)格__gt=50)  & (Q(id=3) | Q(書名="魯濱遜流浪記")) )    # 價(jià)格大于50并且(id=3或者書名=魯濱遜流浪記的書)

                obj = models.書表.objects.filter( Q(價(jià)格__gt=50)  & (Q(id=3) | Q(書名="魯濱遜流浪記")) , 顏色="紅色" )    # 用普通查詢加Q查詢,普通查詢必須放在Q查詢后面(查詢(價(jià)格大于50并且(id=3或者書名=魯濱遜流浪記)并且顏色為紅色的書)

5. 注意,創(chuàng)建表的時(shí)候,為了防止返回內(nèi)存參數(shù),建議寫為如下樣式
    class 書表(models.Model):
                書名 = models.CharField(max_length=30)
                作者 = models.ManyToManyField("作者表") 

                def __str__(self)
                    return self.書名          # 將需要返回的數(shù)據(jù)使用str方法返回
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI