iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Django模型层实例分析
  • 658
分享到

Django模型层实例分析

2024-04-02 19:04:59 658人浏览 泡泡鱼
摘要

这篇文章主要讲解了“Django模型层实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DjanGo模型层实例分析”吧!   一、F查询   在上面

这篇文章主要讲解了“Django模型层实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“DjanGo模型层实例分析”吧!

  一、F查询

  在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

  Django提供F()来做这样的比较。F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值。

  示例:

  建表:

  fromdjango.dbimportmodels

  classGoods(models.Model):

  name=models.CharField(max_length=32)

  price=models.DecimalField(max_digits=8,decimal_places=2)

  remain=models.BigIntegerField()

  sold_out=models.BigIntegerField()

  插入模块

  fromdjango.db.modelsimportF,Q

  例子:查询卖出数量大于库存数的商品名称

  res=models.Goods.objects.filter(sold_out__gt=F('remain')).values_list('name','sold_out','remain')

  print(res)

  #<QuerySet[('袜子',600,100),('夹克',20,10)]>

  F可以帮我们取到表中某个字段对应的值来当作我的筛选条件,而不是我认为自定义常量的条件了,实现了动态比较的效果

  Django支持F()对象之间以及F()对象和常数之间的加减乘除和取模的操作。基于此可以对表中的数值类型进行数学运算

  例子:将每个商品的价格提高50块

  res1=models.Goods.objects.update(price=F('price')+100)

  引申:如何修改char字段,比如将上面的表中商品名称全部尾部加上&lsquo;清仓&rsquo;两个字,如何操作?

  这里需要使用2个模块:Concat和Value

  fromdjango.db.models.functionsimportConcat

  fromdjango.db.modelsimportValue

  res=models.Goods.objects.update(name=Concat(F('name'),Value('清仓')))

  Concat表示进行字符串的拼接操作,参数位置决定了拼接是在头部拼接还是尾部拼接,Value里面是要新增的拼接值

  二、Q查询

  filter()方法汇总的逗号get的条件是与的关系,如果要执行更复杂的查询,比如or的语句,就会用到Q对象

  例子:

  查询卖出数量大于100或者价格小于300的商品名

  fromdjango.db.modelsimportF,Q

  res=models.Goods.objects.filter(Q(sold_out__gt=100)|Q(price__lt=300)).values_list('name','sold_out','price')

  print(res)

  <QuerySet[('袜子清仓',600,Decimal('129.90')),('寸衫清仓',10,Decimal('229.90'))]>

  对条件包裹一层Q时候,filter即可支持交叉并的比较符

  #查询库存数是小于等于20,且卖出数不是10的产品

  res=models.Goods.objects.filter(Q(remain__lte=20)&~Q(sold_out=12)).values_list('name')

  我们可以组合&和|操作符以及使用括号进行分组来编写任意复杂的Q对象。

  同时,Q对象可以使用~操作符取反,这允许组合正常的查询和取反(NOT)查询。

  #查询产品名包含新款或者爆款,且库存大于60的产品

  res=models.Goods.objects.filter(Q(name__contains='新款')|Q(name__contains='爆款'),remain__gt=60).values_list('name')

  查询函数可以混合使用Q对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q对象)都将"AND”在一起。但是,如果出现Q对象,它必须位于所有关键字参数的前面

  重点使用方法补充:

  实例化Q对象:q=Q()

  q.connector='or'#默认q之间的条件都是与关系,这里改成or关系

  q.children.append(('name','sgt'))#插入第一个条件,注意这里传的是一个元祖

  q.children.append(('passWord','123'))#可以继续插入条件

  #q对象支持直接放入filter括号内,它们之间默认是and关系,可以通过上面的q.connect='or'来修改成或关系

  models.User.objects.filter(q)#这里面就是查询的条件们,它们之间默认是与关系,可以修改成or关系

  三、事务

  定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败在里面就回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对事务则是部分支持)

  #事务

  #购买商品

  #产品表中修改数据:卖出数+1,库存-1

  fromdjango.db.modelsimportF

  fromdjango.dbimporttransaction

  try:

  withtransaction.atomic():

  models.Goods.objects.filter(id=1).update(remain=F('remain')-1,sold_out=F('sold_out')+1)

  exceptExceptionase:

  print(e)

  四、补充的一些常用的操作

  update()与save()的区别

  两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部重新写一遍,而update()则是针对修改的项进行针对的更新效率高耗时少

  所以以后对数据的修改保存用update()

  让我们通过ORM数据库操作时候,让终端显示内部查询操作sql语句:

  在Django项目的settings.py文件中,在最后复制粘贴如下代码:

  LOGGING={

  'version':1,

  'disable_existing_loggers':False,

  'handlers':{

  'console':{

  'level':'DEBUG',

  'class':'logging.StreamHandler',

  },

  },

  'loggers':{

  'django.db.backends':{

  'handlers':['console'],

  'propagate':True,

  'level':'DEBUG',

  },

  }

  }

  配置好之后,再执行任何对数据库进行操作的语句时,会自动将Django执行的sql语句打印到PyCharm终端上

  补充:

  除了配置外,还可以通过一点query即可查看查询语句,具体操作如下:

  only与defer

  拿到的是一个对象两者是相反的

  (前提设置:设置每次操作数据库时候都会有sql语句现实在pycharm终端,上面已说明步骤)

  先看看only:

  看看defer

  choice属性

  choice这个属性,用来限制用户做出选择的范围。比如说性别的选择(男或女)

  claSSMyUser(models.Model):

  name=models.CharField(max_length=32)

  password=models.CharField(max_length=32)

  choices=((1,'男'),(2,'女'),(3,'其它'))

  gender=models.CharField(choices=choices,default=1,max_length=5)

  choice接收一个元组(保证值不可变),同理每一个选项也是由一个元组(value,display_name)构成。显而易见,display_name就是要在页面中展示的。

  如何取到value和displayname?

  比如说实例一个User对象user_obj,

  user_obj.gender=value(通过属性取value)

  user_obj.get_gender_display()=display_name(通过get_属性_display()方法取display_name)

  在模板中可以通过模板语言{{user_obj.gender}}很简单地显示value,但不能直接调用get属性_display方法(模板毕竟是模板语言),要解决这个问题,可以用自定义过滤器来搞定:

  来回顾一下如何自定义过滤器:

  1,在应用名下新建一个名为templatetags文件夹

  2,在该文件夹内新建一个py文件,名字随意

  3,在该py文件内添加固定代码和自定义过滤器代码

  fromdjangoimporttemplate

  reGISter=template.Library()

  @register.filter(name='displayName')

  defdisplayName(obj):

  res=obj.get_gender_display

  returnres()

  #视图层:

  fromdjango.shortcutsimportrender,HttpResponse,reverse

  #Createyourviewshere.

  fromapp01importmodels

  defindex(request):

  obj=models.MyUser.objects.filter(pk=1).first()

  returnrender(request,'index.html',locals())

  #前端(html页面):

  {%loadmy_file%}

  {{obj|displayName}}

  bulk_create批量插入数据

  当我们使用orm来一次性新增很多表记录的时候,等待结果的时间会非常的慢,如果一次性需要批量插入很多数据的时候就需要使用bulk_create来批量插入数据

  importrandom

  user_list=['用户[{}]'.format(i)foriinrange(100)]

  data=[]

  forjinuser_list:

  data.append(models.MyUser(name=j,password='123',gender=str(random.choice([1,2,3]))))

  models.MyUser.objects.bulk_create(data)

  select_related和prefetch_related

  defselect_related(self,*fields)

  性能相关:表之间进行join连表操作,一次性获取关联的数据。

  总结

  1.select_related主要针一对一和多对一关系进行优化

  2.select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。

  defprefetch_related(self,*lookups)

  性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在python代码中实现连表操作。

Django模型层实例分析

感谢各位的阅读,以上就是“Django模型层实例分析”的内容了,经过本文的学习后,相信大家对Django模型层实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Django模型层实例分析

本文链接: https://www.lsjlt.com/news/91262.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Django模型层实例分析
    这篇文章主要讲解了“Django模型层实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Django模型层实例分析”吧!   一、F查询   在上面...
    99+
    2024-04-02
  • 【数学模型】层次分析
    Hello大家好,今年数学建模国赛将于9月中旬举行,是时候提前做一些准备了。 本次模型非常简单,只是介绍比较得详细,我下次注意,争取限制下字数。 文末准备了 层次分析-python  模型的实现,简单懂得模型原理便能一眼看懂代码...
    99+
    2023-09-15
    人工智能 python
  • Django视图层与模板层实例详解
    目录theme: channing-cyan网页伪静态视图层1.视图函数的返回值问题2.视图函数返回json格式数据3.form表单携带文件数据4.FBV与CBV5.CBV源码分析模...
    99+
    2024-04-02
  • CSS盒子模型实例分析
    本篇内容介绍了“CSS盒子模型实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! CSS 盒子模型(...
    99+
    2024-04-02
  • css的盒模型实例分析
    这篇文章主要介绍“css的盒模型实例分析”,在日常操作中,相信很多人在css的盒模型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css的盒模型实例分析”的疑惑有所帮...
    99+
    2024-04-02
  • Django之模型层(多表操作)
      一、创建模型   1,一对多关系   一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方,即我们要把外键写在book...
    99+
    2023-01-30
    模型 操作 Django
  • Django 模型层之多表操作
    一.创建模型 实例: 作者表: 拥有字段:姓名(name),性别(sex),该表与书籍表之间为多对多的关系 作者详情表: 拥有字段:地址(addr),手机号(phone),该表与作者表之间为一对一的关系 出版社表: ...
    99+
    2023-01-30
    之多 模型 操作
  • LINQ模型举例分析
    这篇文章主要讲解了“LINQ模型举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LINQ模型举例分析”吧!下面用代码对比一下://DOM模型  XmlDocumen...
    99+
    2023-06-17
  • django之MVT模式的示例分析
    这篇文章主要介绍了django之MVT模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文教程操作环境:windows7系统、django2.1,DELL G3电...
    99+
    2023-06-14
  • Golang内存模型实例源码分析
    这篇文章主要介绍“Golang内存模型实例源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存模型实例源码分析”文章能帮助大家解决问题。1. 简介(Introduction)Go ...
    99+
    2023-07-05
  • Django中模块语言的示例分析
    这篇文章给大家分享的是有关Django中模块语言的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、变量DTL用{{变量名}}格式表示变量。变量名由字母、数字、下划线组成,但不能以下划线开头。Django...
    99+
    2023-06-25
  • Spring AOP底层原理及代理模式实例分析
    这篇文章主要介绍“Spring AOP底层原理及代理模式实例分析”,在日常操作中,相信很多人在Spring AOP底层原理及代理模式实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
    99+
    2023-06-30
  • css3的弹性盒子模型实例分析
    这篇文章主要介绍了css3的弹性盒子模型实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇css3的弹性盒子模型实例分析文章都会有所收获,下面我们一起来看看吧。   1....
    99+
    2024-04-02
  • css盒模型的示例分析
    小编给大家分享一下css盒模型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1.各种盒模型 inline-blo...
    99+
    2024-04-02
  • python+django+mysql开发实例分析
    本篇内容主要讲解“python+django+mysql开发实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python+django+mysql开发实例分析”吧!开发工具:pycharm...
    99+
    2023-06-26
  • Python中Django模板系统的示例分析
    这篇文章主要为大家展示了“Python中Django模板系统的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中Django模板系统的示例分析”这篇文章吧。设置模板路径在dja...
    99+
    2023-06-25
  • Spring Boot底层原理实例分析
    这篇“Spring Boot底层原理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-06-29
  • MySQL数据模型和SQL语言实例分析
    本篇内容主要讲解“MySQL数据模型和SQL语言实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据模型和SQL语言实例分析”吧!一、关系型数据...
    99+
    2024-04-02
  • 数据库中数据模型的实例分析
    数据库中数据模型的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。数据模型可以说软件开发中最重要的部分,因为影响着我们的思考方式、解题思...
    99+
    2024-04-02
  • C语言并发编程模型实例分析
    这篇文章主要介绍“C语言并发编程模型实例分析”,在日常操作中,相信很多人在C语言并发编程模型实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言并发编程模型实例分析”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作