zoukankan      html  css  js  c++  java
  • Python学习第115天(Django的ORM增删改查)

    昨天已经初步介绍了怎么把数据库引入到Django的模型当中,那么今天就说说如何在Django中实现对数据库的增删改查

      今天的增删改查是针对一个表格进行操作的

      今天先上一下实际的代码情况,然后再进行相关的讲解

      首先是Django项目下的url.py文件

    from django.conf.urls import url
    from django.contrib import admin
    
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.index),
        url(r'^addbook/', views.addbook),
        url(r'^update/', views.update),
        url(r'^delete/', views.delete),
        url(r'^select/', views.delete),
    ]

      app文件下的views文件

    fjango.shortcuts import render,HttpResponse
    frrom dom django.db.models import Avg,Min,Sum,Max,Count
    from django.db.models import Q,F
    # Create your views here.
    from app01.models import *
    
    def index(request):
    
    
        return render(request,"index.html")
    
    def addbook(request):
    
        # Book.objects.create(name="linux运维",price=77,pub_date="2017-12-12",publish_id=2)
    
        #publish_obj=Publish.objects.filter(name="人民出版社")[0]
        #Book.objects.create(name="GO",price=23,pub_date="2017-05-12",publish=publish_obj)
    
        # book_obj=Book.objects.get(name="python")
        # print(book_obj.name)
        # print(book_obj.pub_date)
        #
        # #一对多:book_obj.publish--------一定是一个对象
        # print(book_obj.publish.name)
        # print(book_obj.publish.city)
        # print(type(book_obj.publish))
    
    
        #查询人民出版社出过的所有书籍名字和价格
        #方式一:
        # pub_obj=Publish.objects.filter(name="人民出版社")[0]
        # ret=Book.objects.filter(publish=pub_obj).values("name","price")
        # print(ret)
    
        #方式二
        # pub_obj = Publish.objects.filter(name="人民出版社")[0]
        # print(pub_obj.book_set.all().values("name","price"))
        #print(type(pub_obj.book_set.all()))
    
        #方式三
        # ret=Book.objects.filter(publish__name="人民出版社").values("name","price")
        # print(ret)
        #
        # python这本书出版社的名字
        # ret2=Publish.objects.filter(book__name="python").values("name")
        # print(ret2)
        # ret3=Book.objects.filter(name="python").values("publish__name")
        # print(ret3)
        #
        # ret4=Book.objects.filter(publish__city="北京").values("name")
        # print(ret4)
        #
        # ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name")
        # print(ret5)
    
        #通过对象的方式绑定关系
    
    
        # book_obj=Book.objects.get(id=3)
        # print(book_obj.authors.all())
        # print(type(book_obj.authors.all()))
        #
        # author_obj=Author.objects.get(id=2)
        # print(author_obj.book_set.all())
    
    
        # book_obj=Book.objects.get(id=3)
        # author_objs=Author.objects.all()
        # #book_obj.authors.add(*author_objs)
        # # book_obj.authors.remove(*author_objs)
        # book_obj.authors.remove(4)
    
    
    
        #创建第三张表
        # Book_Author.objects.create(book_id=2,author_id=2)
        #
        # obj=Book.objects.get(id=2)
        # print(obj.book_author_set.all()[0].author)
    
        #alex出过的书籍名称及价格
    
        # ret=Book.objects.filter(book_author__author__name="alex").values("name","price")
        # print(ret)
    
        # ret2=Book.objects.filter(authors__name="alex").values("name","price","authors__name")
        # print(ret2)
    
        # ret=Book.objects.all().aggregate(Avg("price"))
        # ret=Book.objects.all().aggregate(Sum("price"))
        # ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price"))
        # ret=Book.objects.filter(authors__name="alex").aggregate(Count("price"))
        # print(ret)
    
        # ret=Book.objects.values("authors__name").annotate(Sum("price"))
        # print(ret)
    
        # ret=Publish.objects.values("name").annotate(abc=Min("book__price"))
        # print(ret)
    
    
        # b=Book.objects.get(name="GO",price=77)
        # print(b)
    
        #Book.objects.all().update(price=F("price")+10)
    
        # ret=Book.objects.filter(Q(name__contains="G"))
        # print(ret)
    
        # ret=Book.objects.filter(Q(name="GO"),price=87)
        # print(ret)
    
        #ret=Book.objects.filter(price=200)
    
        # for i in ret:
        #     print(i.price)
        #
        # Book.objects.all().update(price=200)
        # ret = Book.objects.filter(price=100)
        # for i in ret:
        #     print(i.price)
    
    
        # if ret.exists():
        #     print("ok")
    
        # ret=ret.iterator()
        # print(ret)
        #
        # for i in ret:
        #     print(i.name)
        #
        # for i in ret:
        #     print(i.name)
        return HttpResponse("添加成功")
    
    
    def update():pass
    def delete():pass
    def select():pass

    然后是index.html文件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <script src="jquery-3.1.1.js"></script>
        <title>Title</title>
    
        <style>
            * {
                margin: 0;
                padding: 0
            }
            .head{
                line-height: 40px;
                background-color: green;
                color: white;
                text-align: center;
    
            }
    
        </style>
    </head>
    <body>
    
    <div class="outer">
        <div class="head">标题</div>
        <div class="content">
            <a href="/addbook/">添加书籍</a>
            <a href="/update/">修改书籍</a>
            <a href="/delete/">删除书籍</a>
            <a href="/select/">查询书籍</a>
        </div>
        <hr>
        <div class="queryResult">
             {% for book in book_list %}
             <div>
                  <p>{{ book.name }} {{ book.author }} {{ book.price }}</p>
             </div>
             {% endfor %}
        </div>
    </div>
    
    </body>
    </html>

    下面来具体说一下增删改查的实现吧

      -------------------------------------增(create  ,  save) -------------------------------

    from app01.models import *
    
        #create方式一:   Author.objects.create(name='Alvin')
    
        #create方式二:   Author.objects.create(**{"name":"alex"})
    
        #save方式一:     author=Author(name="alvin")
                        author.save()
    
        #save方式二:     author=Author()
                        author.name="alvin"
                        author.save()

    -----------------------------------------删(delete) ---------------------------------------------

    >>> Book.objects.filter(id=1).delete()
    (3, {'app01.Book_authors': 2, 'app01.Book': 1})

    我们表面上删除了一条信息,实际却删除了三条,因为我们删除的这本书在Book_authors表中有两条相关信息,这种删除方式就是django默认的级联删除。

    -----------------------------------------改(update和save) ----------------------------------------

    实例:

      

    注意:

    <1> 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。

    <2>在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。  

    #---------------- update方法直接设定对应属性----------------
        models.Book.objects.filter(id=3).update(title="PHP")
        ##sql:
        ##UPDATE "app01_book" SET "title" = 'PHP' WHERE "app01_book"."id" = 3; args=('PHP', 3)
    
    
    #--------------- save方法会将所有属性重新设定一遍,效率低-----------
        obj=models.Book.objects.filter(id=3)[0]
        obj.title="Python"
        obj.save()
    # SELECT "app01_book"."id", "app01_book"."title", "app01_book"."price", 
    # "app01_book"."color", "app01_book"."page_num", 
    # "app01_book"."publisher_id" FROM "app01_book" WHERE "app01_book"."id" = 3 LIMIT 1; 
    # 
    # UPDATE "app01_book" SET "title" = 'Python', "price" = 3333, "color" = 'red', "page_num" = 556,
    # "publisher_id" = 1 WHERE "app01_book"."id" = 3;

    在这个例子里我们可以看到Django的save()方法更新了不仅仅是title列的值,还有更新了所有的列。 若title以外的列有可能会被其他的进程所改动的情况下,只更改title列显然是更加明智的。更改某一指定的列,我们可以调用结果集(QuerySet)对象的update()方法,与之等同的SQL语句变得更高效,并且不会引起竞态条件。

    此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

    ---------------------------------------------------------------------------------

    方法比较多,请记住几个关键的filter、get、all、values、order_by

    # 查询相关API:
    
    #  <1>filter(**kwargs):      它包含了与所给筛选条件相匹配的对象
    
    #  <2>all():                 查询所有结果
    
    #  <3>get(**kwargs):         返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
    
    #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------
    
    #  <4>values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
                                         
    #  <5>exclude(**kwargs):     它包含了与所给筛选条件不匹配的对象
    
    #  <6>order_by(*field):      对查询结果排序
    
    #  <7>reverse():             对查询结果反向排序
    
    #  <8>distinct():            从返回结果中剔除重复纪录
    
    #  <9>values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
    
    #  <10>count():              返回数据库中匹配查询(QuerySet)的对象数量。
    
    # <11>first():               返回第一条记录
    
    # <12>last():                返回最后一条记录
    
    #  <13>exists():             如果QuerySet包含数据,就返回True,否则返回False。

    然后我们这些语句都是已经用了Django模块语句,所以下面是一个模块,增加在Django项目下的settings文件下,可以同步显示数据库语言是如何操作的。

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    LOGGING

    嚯嚯,今天内容还是很多的,周末就是好啊。。。。

  • 相关阅读:
    每周一荐:代码编辑器sublime
    每周一荐:Google的序列化框架Protobuf
    每周一荐:ObjectiveC的开源开发环境GNUstep
    每周一荐:用gnuplot绘制函数曲线
    每周一荐:学习ACE一定要看的书
    临时变量管理器
    每周一荐:TotalCommand的文件夹同步功能
    每周一荐:支持latex的思维导图软件docear
    关于程序员面试的一点想法
    每周一荐:Python Web开发框架Django
  • 原文地址:https://www.cnblogs.com/xiaoyaotx/p/13174375.html
Copyright © 2011-2022 走看看