django基础(四)

目录

查询数据

  • 数据库的查询需要使用管理器对象进行

  • 通过 MyModel.objects 管理器方法调用查询接口

    方法说明
    all()查询全部记录,返回QuerySet查询对象
    get()查询符合条件的单一记录
    filter()查询符合条件的多条记录
    exclude()查询符合条件之外的全部记录
  1. all()方法

    • 方法: all()

    • 用法: MyModel.objects.all()

    • 作用: 查询MyModel实体中所有的数据(对象)

      • 等同于
        • select * from tabel
    • 返回值: QuerySet容器对象,内部存放 MyModel 实例

    • 示例:

      from bookstore.models import Book
      books = Book.objects.all()         #books类型是QuerySet,可迭代的
      for book in books:
          print("书名", book.title, '出版社:', book.pub)
      
  2. 在模型类中定义 def __str__(self): 方法可以自定义默认的字符串

    class Book(models.Model):
        title = ...
        def __str__(self):
            return "书名: %s, 出版社: %s, 定价: %s" % (self.title, self.pub, self.price)
    
  3. 查询返回指定列**(字典表示)**
    • 方法: values(‘列1’, ‘列2’)

    • 用法: MyModel.objects.values(…)

    • 作用: 查询部分列的数据并返回

      • select 列1,列2 from xxx
    • 返回值: QuerySet

      • 返回查询结果容器,容器内存字典,每个字典代表一条数据,
      • 格式为: {‘列1’: 值1, ‘列2’: 值2}
    • 示例:

      from bookstore.models import Book
      books = Book.objects.values("title", "pub")
      for book in books:
          print("书名", book["title"], '出版社:', book['pub'])
          print("book=", book)
      
  4. 查询返回指定列(元组表示)

    • 方法:values_list(‘列1’,‘列2’)

    • 用法:MyModel.objects.values_list(…)

    • 作用:

      • 返回元组形式的查询结果
    • 返回值: QuerySet容器对象,内部存放 元组

      • 会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中
    • 示例:

      from bookstore.models import Book
      books = Book.objects.values_list("title", "pub")
      for book in books:
          print("书名", book[0], '出版社:', book[1])
          print("book=", book)  # ('Python', '清华大学出版社')...
      
  5. 排序查询

    • 方法:order_by

    • 用法:MyModel.objects.order_by(’-列’,‘列’)

    • 作用:

      • 与all()方法不同,它会用SQL 语句的ORDER BY 子句对查询结果进行根据某个字段选择性的进行排序
    • 说明:

    • ​ 默认是按照升序排序,降序排序则需要在列前增加’-'表示

    • 示例:

      from bookstore.models import Book
      books = Book.objects.order_by("price")
      for book in books:
      print("书名:", book.title, '定价:', book.price)
      
  6. 条件查询 - filter

    • 方法: filter(条件)

    • 语法:

      MyModel.objects.filter(属性1=1, 属性2=2)
      
    • 返回值:

      • QuerySet容器对象,内部存放 MyModel 实例
    • 说明:

      • ** **即当Books.objects.filter(price=20, pub="清华大学出版社") 返回定价为20 出版社为"清华大学出版社"的全部图书
    • 示例:

      # 查询书中出版社为"清华大学出版社"的图书
      from bookstore.models import Book
      books = Book.objects.filter(pub="清华大学出版社")
      for book in books:
          print("书名:", book.title)
      
      # 查询Author实体中name为王老师并且age是28岁的
          authors=Author.objects.filter(name='王老师',age=28)
      

    filter方法查询时的限制:1.只能是等值 2.与关系

    如果是想表示诸如 > < >=等关系,引入查询谓词;如果想表示或、非关系,引入Q对象

  7. 条件查询 - exclude

    • 方法: exclude(条件)

    • 语法:

      • MyModel.objects.exclude(条件)
    • 作用:

      • 返回不包含此 条件 的 全部的数据集
    • 示例:

      • 查询 清华大学出版社,定价等于50 以外的全部图书
      books = Book.objects.exclude(pub="清华大学出版社", price=50)
      for book in books:
          print(book)
      
  8. 条件查询 - get

    • 方法: get(条件)

    • 语法:

      • MyModel.objects.get(条件)
    • 作用:

      • 返回满足条件的唯一一条数据
    • 说明:

      • 该方法只能返回一条数据
      • 查询结果多余一条数据则抛出,Model.MultipleObjectsReturned异常
      • 查询结果如果没有数据则抛出Model.DoesNotExist异常
    • 示例:

      from bookstore.models import Book
      book = Book.objects.get(id=1)
      print(book.title)
      

      在使用get方法时,一定要做异常处理

      Queryset有一个属性,得到对应的查询字符串

查询谓词

  • 每一个查询谓词是一个独立的查询功能
  1. __exact : 等值匹配

    Author.objects.filter(id__exact=1)
    # 等同于select * from author where id = 1
    
  2. __contains : 包含指定值

    Author.objects.filter(name__contains='w')
    # 等同于 select * from author where name like '%w%'
    
  3. __startswith : 以 XXX 开始

  4. __endswith : 以 XXX 结束

  5. __gt : 大于指定值 greate then

    Author.objects.filer(age__gt=50)
    # 等同于 select * from author where age > 50
    
  6. __gte : 大于等于

  7. __lt : 小于 lt

  8. __lte : 小于等于

  9. __in : 查找数据是否在指定范围内

    • 示例
    Author.objects.filter(country__in=['中国','日本','韩国'])
    # 等同于 select * from author where country in ('中国','日本','韩国')
    
  10. __range: 查找数据是否在指定的区间范围内 [闭区间]

    # 查找年龄在某一区间内的所有作者
    Author.objects.filter(age__range=(35,50))
    # 等同于 SELECT ... WHERE Author BETWEEN 35 and 50;
    
  11. 详细内容参见: https://docs.djangoproject.com/en/2.2/ref/models/querysets/#field-lookups

  • 示例

    MyModel.objects.filter(id__gt=4)
    # 等同于 SELECT ... WHERE id > 4;
    
  • 练习:

    1. 查询Book表中price大于等于50的信息

    2. 查询Author表中姓王的人的信息

    3. 查询Author表中Email中包含"w "的人的信息

修改数据

  1. 修改单个实体的某些字段值的步骤:

      • 通过 get() 得到要修改的实体对象
      • 通过 对象.属性 的方式修改数据
    1. 保存
      • 通过 对象.save() 保存数据
    • 如:

      from bookstore.models import Book
      abook = Book.objects.get(id=10)
      abook.market_price = "10.5"
      abook.save()
      
  2. 通过 QuerySet 批量修改 对应的全部字段

    • 直接调用QuerySet的update(属性=值) 实现批量修改

    • 返回值:更新数据的数量

    • 如:

      # 将id大于3的所有图书价格定为0元 
      #如果结果没有被使用,这不操作他不会执行,当然也不会访问数据库[惰性查询,延迟执行]
      books = Book.objects.filter(id__gt=3)
      books.update(price=0)
      # 将所有书的零售价定为100元
      books = Book.objects.all()
      books.update(market_price=100)
      

删除数据

  • 删除记录是指删除数据库中的一条或多条记录
  • 删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法
  1. 删除单个对象

    • 步骤

      1. 查找查询结果对应的一个数据对象
      2. 调用这个数据对象的delete()方法实现删除
    • 示例:

      try:
          auth = Author.objects.get(id=1)
          auth.delete()
      except:
          print(删除失败)
      
  2. 删除查询结果集

    • 步骤

      1. 查找查询结果集中满足条件的全部QuerySet查询集合对象
      2. 调用查询集合对象的delete()方法实现删除
    • 示例:

      # 删除全部作者中,年龄大于65的全部信息
      auths = Author.objects.filter(age__gt=65)
      auths.delete()
      
    在实际的开发中,数据一般情况下会删除吗?
    通常会在表中增加一个标志字段,表示数据是否可用.[删除标记]

    聚合查询

  • 聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询,查bookstore_book数据表中的全部书的平均价格,查询所有书的总个数等,都要使用聚合查询
  1. 不带分组聚合

    • 不带分组的聚合查询是指导将全部数据进行集中统计查询

    • 聚合函数【需要导入】:

      • 导入方法: from django.db.models import *
      • 聚合函数:
        • Sum, Avg, Count, Max, Min
    • 语法:

      • MyModel.objects.aggregate(结果变量名=聚合函数(‘列’))
    • 返回结果:

      • 由 结果变量名和值组成的字典
      • 格式为:
        • `{“结果变量名”: 值}
    • 示例:

      # 得到所有书的平均价格
      from bookstore.models import Book
      from django.db.models import Avg
      result = Book.objects.aggregate(myAvg=Avg('price'))
      print("平均价格是:", result['myAvg'])
      print("result=", result)  # {"myAvg": 58.2}
      
      # 得到数据表里有多少本书
      from django.db.models import Count
      result = Book.objects.aggregate(mycnt=Count('title'))
      print("数据记录总个数是:", result['mycnt'])
      print("result=", result)  # {"mycnt": 10}
      
      
  2. 分组聚合

    • 分组聚合是指通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

    • 语法:

      • QuerySet.annotate(结果变量名=聚合函数(‘列’))
    • 用法步骤:

      1. 通过先用查询结果MyModel.objects.values 查找查询要分组聚合的列

        • MyModel.objects.values(‘列1’, ‘列2’)

        • 如:

          pub_set = Book.objects.values('pub')
          print(pub_set)  # <QuerySet [{'pub': '清华大学出版社'}, {'pub': '清华大学出版社'}, {'pub_hou {'pub': '机械工业出版社'}, {'pub': '清华大学出版社'}]>
          
          
      2. 通过返回结果的 QuerySet.annotate 方法分组聚合得到分组结果

        • QuerySet.annotate(名=聚合函数(‘列’))

        • 返回 QuerySet 结果集,内部存储结果的字典

        • 如:

          pub_count_set = pub_set.annotate(myCount=Count('pub'))
          print(pub_count_set)  # <QuerySet [{'pub': '清华大学出版社', 'myCount': 7}, {'pub': '机械工业出版社', 'myCount': 3}]>
          
    • 示例:

      • 得到哪儿个出版社共出版多少本书
      def test_annotate(request):
         from django.db.models import Count
         from . import models
      
          # 得到所有出版社的查询集合QuerySet
          pub_set = models.Book.objects.values('pub')
          # 根据出版社查询分组,出版社和Count的分组聚合查询集合
          pub_count_set = pub_set.annotate(myCount=Count('pub'))  # 返回查询集合
          for item in pub_count_set:
              print("出版社:", item['pub'], "图书有:", item['myCount'])
          return HttpResponse('请查看服务器端控制台获取结果')
      

result=Book.objects.values(‘pub’).annotate(mycount=Count(‘pub’)).filter(mycount__gt=2)

pritn(result.query)

F对象

  • 一个F对象代表数据库中某条记录的字段的信息
  1. 作用:

    • 通常是对数据库中的字段值在不获取的情况下进行操作
    • 用于类属性(字段)之间的比较。
  2. 用法

    • F对象在数据包 django.db.models 中,使用时需要先导入
      • from django.db.models import F
  3. 语法:

    from django.db.models import F
    F('列名')  
    
  4. 说明:

    • 一个 F() 对象代表了一个model的字段的值
    • F对象通常是对数据库中的字段值在不加载到内存中的情况下直接在数据库服务器端进行操作
  5. 示例1

    • 更新Book实例中所有的零售价涨10元(语义是先要知道原来的价格,在原来的价格基础上+10元)
    Book.objects.all().update(market_price=F('market_price')+10)
    'UPDATE `bookstore_book` SET `market_price` = (`bookstore_book`.`market_price` + 10) 
    # 以上做法好于如下代码
    books = Book.objects.all()
    for book in books:
        book.market_price=book.marget_price+10
        book.save()
    
  6. 示例2

    • 对数据库中两个字段的值进行比较,列出哪儿些书的零售价高于定价?
    from django.db.models import F
    from bookstore.models import Book
    books = Book.objects.filter(market_price__gt=F('price'))
    'SELECT * FROM `bookstore_book` WHERE `bookstore_book`.`market_price` > (`bookstore_book`.`price`)
    for book in books:
        print(book.title, '定价:', book.price, '现价:', book.market_price)
    

Q对象

  • 当在获取查询结果集 使用复杂的逻辑或 | 、 逻辑非 ~ 等操作时可以借助于 Q对象进行操作

  • 如: 想找出定价低于20元 或 清华大学出版社的全部书,可以写成

    Book.objects.filter(Q(price__lt=20)|Q(pub="清华大学出版社"))
    
  • Q对象在 数据包 django.db.models 中。需要先导入再使用

    • from django.db.models import Q
  1. 作用

    • 在条件中用来实现除 and(&) 以外的 or(|) 或 not(~) 操作
  2. 运算符:

    • & 与操作
    • | 或操作
    • 〜 非操作
  3. 语法

    from django.db.models import Q
    Q(条件1)|Q(条件2)  # 条件1成立或条件2成立
    Q(条件1)&Q(条件2)  # 条件1和条件2同时成立
    Q(条件1)&~Q(条件2)  # 条件1成立且条件2不成立
    ...
    
  4. 示例

    from django.db.models import Q
    # 查找清华大学出版社的书或价格低于50的书
    Book.objects.filter(Q(market_price__lt=50) | Q(pub_house='清华大学出版社'))
    # 查找不是机械工业出版社的书且价格低于50的书
    Book.objects.filter(Q(market_price__lt=50) & ~Q(pub_house='机械工业出版社'))
    

原生的数据库操作方法

如何解决sql注入攻击:

1.检查用户输入的数据,避免特殊字符

2.将所有功能封装成存储过程(带参数),一定程度上防范sql注入攻击

XSS防范措施:转义

  • 使用MyModel.objects.raw()进行 数据库查询操作查询

    • 在django中,可以使用模型管理器的raw方法来执行select语句进行数据查询
    1. 语法:

      • MyModel.objects.raw(sql语句,[拼接参数])
    2. 用法

      • MyModel.objects.raw('sql语句', [拼接参数])
    3. 返回值:

      • RawQuerySet 集合对象 【只支持基础操作,比如循环】
      • [orm返回值通常是QuerySet,QuerySet有很多方法,方便操作]
    4. 示例

books = Book.objects.raw('select * from bookstore_book')
for book in books:
    print(book)

#sql注入问题
s1 = Book.objects.raw('select * from bookstore_book where id=%s'%('1 or 1=1'))

s2 = Book.objects.raw('select * from bookstore_book where id=%s',['1 or 1=1'])
    
  • 使用django中的游标cursor对数据库进行 增删改查 操作

    • 在Django中跨国模型类直接操作数据库

    • 使用步骤:

      1. 导入cursor所在的包

        • Django中的游标cursor定义在 django.db.connection包中,使用前需要先导入
        • 如:
          • from django.db import connection
      2. 用创建cursor类的构造函数创建cursor对象,再使用cursor对象,为保证在出现异常时能释放cursor资源,通常使用with语句进行创建操作

        • 如:

          from django.db import connection
          with connection.cursor() as cur:
              cur.execute('执行SQL语句', '拼接参数')
          
    • 示例

      # 用SQL语句将id 为 10的 书的出版社改为 "XXX出版社"
      from django.db import connection
      with connection.cursor() as cur: 
      cur.execute('update bookstore_book set pub_house="XXX出版社" where id=10;')
      
      with connection.cursor() as cur:
          # 删除 id为1的一条记录
          cur.execute('delete from bookstore_book where id=10;')
           
      

总结:

传参的两种方式:

​ 1.path转换器:

​ 地址栏 :bookstore/update_book/1

​ urls.py: path(‘update_book/int:bid’,view.update_book)

​ views.py:

​ def update_book(request,bid):

​ # 直接使用参数bid

​ 2.查询字符串:

​ 地址栏:bookstore/delect_book?bid=2

​ urls.py:path(‘delect_book’,views.delect_book)

​ views.py:

​ def delect_book(request):

​ bid = request.GET.get(‘bid’) # 获取查询字符串的值

3.获取用户在表单中的输入:
request.GET.get(‘表单元素的名称’)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Django基础教程PDF是一本详细讲解Django框架的书籍。Django是一个基于Python的高效Web应用开发框架,使用Django可以快速开发高质量、安全且易维护的Web应用程序。这本书从Django基础概念、安装、配置、模型、视图、模板、表单、认证、管理等方面,详细解释了如何使用Django进行Web应用开发。 其中,书籍的第一部分主要讲解了Django框架的基础知识,包括Django的架构、安装配置、虚拟环境、应用以及包管理等等。第二部分则详细阐述了Django的各种模型,包括Model、QuerySet以及Django ORM的操作等。第三部分则重点讲解了Django的视图,包括视图函数、URL路由以及视图的响应等等。第部分则阐述了Django的模板系统,包括模板语言、模板渲染以及静态文件等。第五部分讲解了Django的表单系统,包括表单类的定义、视图函数的编写以及表单的提交和验证等。第六部分则深入讲解Django的认证系统、权限管理以及用户注册等内容。最后一部分则介绍了Django的管理后台、中间件、缓存、测试和部署等方面的内容。 总之,Django基础教程PDF对于想要学习并掌握Django框架的开发者来说是一本非常好的入门书籍。它详细介绍了Django框架的整个开发流程,给予开发者夯实的理论基础和实操能力,让开发者能够高效地使用Django框架进行Web应用开发。 ### 回答2: Django是一个高效的Python Web应用程序框架,它的特点是快速开发、可拓展性和丰富的功能性。对于初学者来说,学习Django框架并不是一件容易的事情,因此《Django基础教程》成为了很多开发者必备的学习资料。 《Django基础教程》详细介绍了Django框架的各种概念和操作方法,包括了模型、视图、模板、表单、路由等方面的基础知识。这本教程以实践为主,让读者通过自己手写一个简单的博客系统来获取对Django框架的全面认识。 教程的阅读需要基本的Python编程知识,因为它是使用Python语言编写的。在读完本教程后,读者可以掌握Django框架的开发流程,了解Django的中间件和模型、视图、模板的关系,掌握如何与数据库进行交互以及如何使用Django表单等。 值得一提的是,《Django基础教程》是一本中文教程,将一些比较抽象的概念解释得十分清楚易懂。而且它还针对Django 2.x 版本进行了详细介绍,非常贴近当前开发环境,可以让读者快速开发出一个简单的Web应用程序。 总而言之,《Django基础教程》是一本非常优秀、权威、全面的Django框架学习资料,它的内容详尽,范例丰富,让读者学习起来既轻松而又有深度。对于初学者来说,它是一个不容错过的学习宝典。 ### 回答3: Django是一个流行的Python Web框架,已经成为许多Web应用程序开发人员的首选。有很多教程和资源可用,其中包括Django基础教程,可作为入门学习Django的教材。 这本教程的重点是了解Django基础知识,例如Django框架的架构、模型-视图-控制器(MVC)模式、Django模型和Django视图等。它涵盖了创建新的Django项目,如何在Django项目中创建和管理应用程序,以及如何利用Django模板和表单在网页中呈现和处理数据。 该教程还提供了一些简单的应用程序示例,如博客和投票应用程序,这些教程旨在帮助读者嵌入并了解Django的工作原理。 在学习Django基础教程时,读者将学习如何编写干净、可读、可扩展和可维护的代码。这是应用程序开发中的最佳实践之一,有助于确保应用程序的可靠性。 总之,Django基础教程是入门学习Django框架的好材料,它能够为初学者提供一些基本的理解和编程技能,同时也提供了一些实用而有趣的示例,帮助学习者了解和熟悉Django框架的工作方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值