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

巴黎香榭發表於2018-10-21
模型中的CRUD
    增加資料:
        1.Entry.objects.create(屬性1=值, 屬性2=值,…)
          返回值:
            建立好的模型物件
def add_views(request):
    # 三種增加方式
    # 1.Entry.objects.create()
    obj = Author.objects.create(name="Paris", age=18, email="wei8023@gmail.com")
    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="laowang@email.com")
    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": "wang@qq.com",
    }
    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 = "baidu@163.com"
    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")


相關文章