Python全棧 Web(Django框架、模型中的CRUD)

模型中的CRUD
    增加數據:
        1.Entry.objects.create(屬性1=值, 屬性2=值,...)
          返回值:
            創建好的模型對象

def add_views(request):
    # 三種增加方式
    # 1.Entry.objects.create()
    obj = Author.objects.create(name="Paris", age=18, email="[email protected]")
    print(obj.id, obj.name, obj.age, obj.email)

        2.創建一個Entry對象 並通過save() 進行保存
          obj = Entry(屬性1=值1, ..)
          obj.屬性 = 值
          obj.save()
          沒有返回值  保存成功後obj會被重新賦值

    # 2.obj.save()
    obj = Author(name="王大錘", age=32, email="[email protected]")
    obj.save()
    print(obj.id, obj.name, obj.age, obj.email)

        3.使用字典構建成對象 並通過save()保存
          dic = {
            "屬性1": "值1"
            ...
          }
          obj = Entry(**dic)
          obj.save()

    # 3. obj.save()
    dic = {
        "name": "wangdacui",
        "age": 33,
        "email": "[email protected]",
    }
    obj = Author(**dic)
    obj.save()
    print(obj.id, obj.name, obj.age, obj.email)
    return HttpResponse("OK")

    查詢數據:
        所有的查詢 通過Entry.objects 調用查詢接口函數
        Entry.objects.filter()
        所有的查詢接口 都可以通過一個query屬性來得到對應的sql語句
        Entry.objects.filter().query

        基本查詢操作:
            all()
                Entry.objects.all()
                返回queryset(查詢結果集,是一個封裝了若干個對象的列表)


def query_views(request):
    # all()  查詢所有Author實體中所用的數據
    authors = Author.objects.all()
    print(authors.query)
    print(authors)

    # 循環遍歷authors得到每一個數據
    for author in authors:
        print(author.id, author.name, author.email)

        查詢返回指定列:
            values()|values("字段1", "字段2"...)
                Entry.objects.values()
                Entry.objects.values("name", "age")
                查詢一個queryset中的部分列  並風封裝成字典 再放到列表中
                也允許將values放在其返回查詢結果集的後面

    # 查詢部分列
    names = Author.objects.values("name")
    for name in names:
        print(name["name"])
    print(names)

    # 在查詢所有結果的基礎上進行篩選
    names = Author.objects.all().values("name")
    for name in names:
        print(name["name"])

        查詢返回指定列:
            values_list()
                將結果封裝到元祖中在封裝到列表中返回
                用法同values


    # 將查詢結果封裝到元組再封裝到列表中
    authors = Author.objects.values_list()
    for author in authors:
        print(author[0], author[2])

        只查詢一條數據:
            get(條件)
                查詢只返回一條數據
                Entry.objects.get(條件)
                如果查詢結果爲空或者查詢結果不是一條記錄都會拋異常

    # 只查詢一條數據
    author = Author.objects.get(id=1)
    print(author)

        查詢部分行數據:
            filter(條件1, 條件2,...)
                Entry.objects.filter(條件)
                使用逗號隔開表示使用and鏈接方式查詢
                Author.objects.filter(id=1, name="Paris")

# filter根據條件篩選 authors = Author.objects.filter(id=1) print(authors.query) print(authors) # and方式查詢 author = Author.objects.filter(id=2, name="Paris").values() print(author)

                在條件查詢中 Django提供了若干個查詢謂詞(Field Looups)
                可以完成非等值條件的查詢
                Entry.objects.filter(屬性__查詢謂詞=值)
                所有支持條件查詢的地方都可以寫謂詞
                filter(),get(),exclude()

    # 查詢所有age大於30的author信息
    authors = Author.objects.filter(age__gt=30).values()
    print(authors)
    # 查詢所有姓王的author信息
    authors = Author.objects.filter(name__startswith="王").values()
    print(authors)
    # 查詢所有email中包含wang的author信息
    authors = Author.objects.filter(email__contains="wang")
    print(authors)

    對條件去反:
            exclude(條件)
            對現有條件進行取反操作查詢
            Entry.objects.exclude(條件)

    # 對條件取反操作  查詢年齡小於30的
    author = Author.objects.exclude(age__gt=30).valuea()
    

        聚合查詢(無分組):
            aggregate()
            Entry.objects.all().aggregate(名=聚合函數("字段")
            集合函數:
                Avg()    平均值
                Count()  數量
                Sum()    求和
                Min()    求最小
                Max()    求最大

    # 聚合函數
    result = Author.objects.all().aggregate(avg=Avg("age"))
    print(result)

        聚合查詢(有分組)
            annotate()
            Entry.objects.all().values("字段1", ...).annotate(字段=聚合函數()).values('字段1'...)
            第一個values是用於做聚合分組 第二個是具體篩選的值

    # 分組聚合
    result = Author.objects.values("isActive").annotate(sum=Sum("age")).filter(isActive=True).all()
    print(result)

        排序查詢:
            order_by()
            Entry.objects.order_by("字段1", "字段2")
            默認升序  以列1進行排序 如果列1出現重複以列2進行排序
            降序排序在列明前加"-"號

    # 排序查詢
    result = Author.objects.order_by("-id")
    for re in result:
        print(re)

    修改單個實體:
        1.查
          通過get()得到要修改的實體對象
        2.改
          通過對象的屬性來修改對象的值
        3.保存
          通過對象的save()保存會數據庫

def update1_views(request):
    # # 修改ID爲2 的author信息
    au = Author.objects.get(id=2)
    au.age = 33
    au.email = "[email protected]"
    au.isActive = False
    au.save()

    批量修改:
        調用 QuerySet的update(屬性=值, 屬性=值) 實現批量修改

    # 將isActive爲False的數據  全部改爲True
    Author.objects.filter(isActive=False).update(isActive=True)

    刪除:
        調用實體對象或查詢結果集的delete()就可以刪除

    # 刪除
    author = Author.objects.get(id=1)
    author.delete()

    author = Author.objects.filter(name="Paris")
    author.delete()

        一般情況下很少有刪除都是利用改變某個字段的狀態來達到刪除的效果

    author = Author.objects.get(id=id)
    # 通過修改狀態模擬刪除
    author.isActive = False
    author.save()

       django轉發與重定向的區別  轉發:相當只有一個路由最終的結果是由一個視圖函數處理
           另一個視圖只是做了一個調用另個函數的作用   
           重定向是訪問 兩個路由  分別由兩個視圖進行處理 
           轉發不會改變url 只有一個請求  重定向會改變url  有兩次請求

    # 轉發
    # return query_all_views(request)

    # 重定向
    # return HttpResponseRedirect("/query_all")
    return redirect("/query_all")




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章