一、通过 ORM 向 DB 中增加数据

1、Entry.objects.create(属性=值,属性=值)
Entry:具体要操作的Model类

ex:
  Author.objects.create(name='zsf',age=85)

2、创建一个 Models 对象,通过对象的 save() 完成增加

ex:
  author = Author(names='laoshe',age=65)
  author.save()

3、使用字典构建属性,通过 save() 完成增加
dic = {
'属性1':'值1',
'属性2':'值2',
}

obj = Entry(**dic)
obj.save()

4、首先尝试获取,不存在就创建,可以防止重复

Author.objects.get_or_create(names='laoshe',age=65)

备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False

二、查询操作

通过 Entry.objects 调用查询接口

1、查询所有对象
语法:all()
用法:Entry.objects.all()
返回:QuerySet

ex:
  Author.objects.all()
  等同于:select * from index_author

返回结果:
<QuerySet [<Author: Author object>, <Author: Author object>, <Author: Author object>]>

2、查询指定列
语法:values('列1','列2',...)
用法:Entry.objects.values('列1','列2',...)
返回:QuerySet(返回一个包含数据的字典的queryset,而不是模型实例)

ex:
  Author.objects.values('names','age')
  等同于:select name,age from index_author

注意:
  values()可以用在所有的返回查询结果集的方法的后面

  Author.objects.all().values('names','age')

  <QuerySet [{'age': 65, 'names': 'ZhuZiqing'}, {'age': 68, 'names': 'laoshe'}, {'age': 59, 'names': 'MoYan'}]>

  

3、排序函数

语法:order_by('列1','列2')
用法:Entry.objects.order_by('-列1','列2')
默认的排序规则是升序
如果需要降序,则在列前添加一个 "-"
ex:
  1、Author.objects.order_by('age')
  2、Author.objects.all().order_by('-age');

4、对条件取反
语法:exclude()
用法:Entry.objects.exclude(条件)
ex:
  1、Author.objects.exclude(id=3)
  等同于:select * from author where not (id=3)
  2、Author.objects.exclude(id=3,age=85)
  等同于:select * from author where not (id=3 and age=85)

5、根据条件查询部分行数据(重难点)
方法:filter(参数)
用法:Entry.objects.filter(参数)
1、使用 Entry 中的属性作为查询参数
多个参数的话,使用 , 隔开,映射到sql语句上,是使用 and 来进行关联的
ex:
  1、Author.objects.filter(id=1)
  等同于:select * from author where id=1
  2、Author.objects.filter(id=1,name='莫言')
  等同于:select * from author where id=1 and name='莫言'
2、通过 Field Lookup(查询表达式)完成复杂条件的构建
查询表达式:每个查询表达式都是一个独立的查询条件,可以用在所有的有查询条件的位置处
  1、__contains(__icontains忽略大小写)
  作用:筛选出属性中包含指定关键字的记录(模糊查询)
  ex:
    Author.objects.filter(names__contains='ao')
    select * from author where names like '%ao%'

  2、__in

   作用:筛选出属性值在其中之一的记录
   ex:
    Author.objects.filter(id__in=[1,3])
      select * from author where id in (1,3)

  3、__lt
  作用:筛选出属性值小于指定值的记录
  4、__lte
  作用:筛选出属性值小于等于指定值的记录
  5、__gt
  作用:筛选出属性值大于指定值的记录
  6、__gte
  作用:筛选出属性值大于等于指定值的记录
  7、__startswith
  作用:筛选出以指定关键字开始的记录
  8、__endswith
  作用:筛选出以指定关键结尾的记录

6、查询只返回一条数据
语法:get(条件)
用法:Entry.objects.get(查询条件/表达式)
get和filter区别:

  参数:
    get 的参数只能是model中定义的那些字段,只支持严格匹配

    filter 的参数可以是字段,也可以是扩展的查询表达式,如in,contains等

  返回值:

    get 返回值是一个定义的model对象

     filter 返回值是一个新的queryset对象,然后可以对queryset在进行查询返回新的queryset对象,支持链式操作

  异常:

    get 只有一条记录返回的时候才正常,也就说明get的查询字段必须是主键或者唯一约束的字段,当返回多条记录或者是没有找到记录的时候都会抛出异常

    filter 有没有匹配的记录都可以,如果没有匹配的记录会返回一个空的queryset

三、修改数据

1、修改单个数据
  1、通过 get() 得到要修改的实体对象
  2、通过实体对象的属性修改属性值
  3、再通过实体对象的save()保存回数据库
ex:
  au = Author.objects.get(id=1)
  au.names = "老舍"
  au.age = 45
  au.save()

2、批量修改数据
调用查询结果集的 update() 完成批量修改
Entry.objects.all().update(属性=值,属性=值)

ex:
  Author.objects.all().update(age=75)

四、删除数据
调用实体对象/查询结果集的 delete() 即可

Person.objects.filter(name__contains="abc").delete()  # 删除名称中包含 "abc"的人

如果写成
people = Person.objects.filter(name__contains="abc")
people.delete()
效果也是一样的,Django实际只执行一条 SQL 语句。

Django 模型中的CRUD的更多相关文章

  1. 如何在Django模型中管理并发性 orm select_for_update

    如何在Django模型中管理并发性 为单用户服务的桌面系统的日子已经过去了 - 网络应用程序现在正在为数百万用户提供服务,许多用户出现了广泛的新问题 - 并发问题. 在本文中,我将介绍在Django模 ...

  2. Django模型中OneToOneField和ForeignKey的区别

    网上看到一篇讲解"Django模型中OneToOneField和ForeignKey区别" 的文章,浅显易懂; 可以把ForeignKey形象的类比为: ForeignKey是on ...

  3. 如何让django模型中的字段和model名显示为中文

    如何让django模型中的字段和model名显示为中文:在模型中加入class Meta即可 class People(models.Model): name = models.CharField(n ...

  4. django模型中的抽象类(abstract)

    首先介绍下django的模型有哪些属性:先看例子: Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模 ...

  5. Django 模型中自定义Manager和模型方法

    1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager. 每个Django模型至少有一个m ...

  6. django模型中的关系对应

    显然,关系数据库的力量在于将表相互关联.Django提供了定义三种最常见的数据库关系类型的方法:多对一,多对多和一对一. 在说明之前,首先来理解一下这三个概念: 多对一: 两个集合a,b;集合a中的多 ...

  7. django 模型中 class Meta 内 各种属性的用法

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应数据库表的 ...

  8. Django 模型中FileField字段

    FileField¶ class FileField([upload_to=None, max_length=100, **options])¶ 一个上传文件的字段. 注意 FileField字段不支 ...

  9. 在 django模型中封装元组和字典, 字段中使用chioce参数实现数据的一一对应

    一.models.py中 class OrderInfo(BaseModel): '''订单模型类''' # 封装一个字典, 便于在视图中取值, 进行比对 PAY_METHODS = { : &quo ...

随机推荐

  1. git使用记录六:对commit的message做处理

    修改最新commit的message git commit --amend 修改老旧commit的message 查询最新的三个log soaeon@DESKTOP-FUJJTHR MINGW64 / ...

  2. django-2-目录结构

    django是MVC或者叫MTV框架

  3. Spring学习笔记(10)——方法注入

    引用 在大部分情况下,容器中的bean都是singleton类型的.如果一个singleton bean要引用另外一个singleton bean,或者一个非singleton bean要引用另外一个 ...

  4. JS事件委托(事件代理,dom2级事件)

    一.前言 说实话,真问我什么是事件委托,我肯定gg,还好查了一下,原来就是我之前练习过的DOM2级事件的应用. 二.什么是事件委托? 事件委托就是当事件触发时,把要做的事委托给父元素(或父元素的父元素 ...

  5. 【牛客网-剑指offer】矩形覆盖

    题目: 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形.请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 分析: 假设2为高,n为宽 因为高为2固定,会出现固定情况,即无论 ...

  6. Makefile总结(转帖)

    文章地址:http://www.cnitblog.com/textbox/archive/2009/10/21/62036.aspx makefile 主要包含以下几点  显式规则 :描述了在何种情况 ...

  7. vue 如何读取编译携带的参数

    vue 环境有很多套,我们需要根据不同环境设置不同的一些参数,如何不装任何依赖的情况下获取参数 下面是我制作官网,需要根据开发还是生产环境配置不同CDN,用vue-cli2+webpack,配置是再: ...

  8. Python 获取当前文件所在路径

    记录几个os获取路径的函数 1. os.path.realpath(__file__):获取文件的绝对路径,包括文件自己的名字 2.os.path.dirname(path):获取path路径的上级路 ...

  9. RGBA的值0-255范围如何转换成0-1范围

    这样一个rgba(1,0,0,1) 如果我们要把它转换成 0-255范围 就是rgb分别乘以255 就是 rgba(255,0,0,1) 0-255转0-1范围 如 rgba(34,56,56,1)转 ...

  10. Linux文本处理三剑客之——grep

    一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...