1.一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录。

2.管理器和查询集。

  • 查询集QuerySet表示从数据库中取出来的对象的集合。它可以含有零个、一个或者多个过滤器。过滤器基于所给的参数限制查询的结果。查询集有可迭代和可切片的特点。
  • 每个模型都至少有一个管理器,它默认命名为objects管理器只可以通过模型的类访问,而不可以通过模型的实例访问,目的是为了强制区分“表级别”的操作和“记录级别”的操作。
>>>Blog.objects
<django.db.models.manager.Manager object at ...>
>>> b = Blog(name='Foo', tagline='Bar')
>>> b.objects
Traceback:
...
AttributeError: "Manager isn't accessible via Blog instances."

3.创建、更改,并保存一个实例

 from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
b.name = 'New name'
b.save()

  注意:在调用b.save()时,Django才正真访问数据库。

  也可以使用管理器的create方法,一步创建和保存。

p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
  • 更新ForeignKey 字段的方式和保存普通字段相同 —— 只要把一个正确类型的对象赋值给该字段。
  • 更新ManyToManyField 的方式有一些不同 —— 需要使用字段的add()方法来增加关联关系的一条记录。为了在一条语句中,向ManyToManyField添加多条记录,可以在调用add()方法时传入多个参数
from blog.models import Author
joe = Author.objects.create(name="Joe")
entry.authors.add(joe)

  可以使用update() 方法为一个查询集中所有对象的某个字段都设置一个特定的值。

# Update all the headlines with pub_date in 2007.
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')

4.获取对象(大多数情况下,需要从数据库中查找对象时,会使用all()、 get()filter() 和exclude()。 然而,这只是冰山一角;查询集方法的完整列表,请参见查询集API 参考https://docs.djangoproject.com/en/1.10/ref/models/querysets/。)

  • 获取所有对象
all_blogs = Blog.objects.all()

  all()方法返回包含数据库中所有对象的一个查询集

  • 可以使用filter(**kwargs),exclude(**kwargs)设置过滤条件,返回一个新的查询子集。
Entry.objects.filter(headline__startswith='What').exclude(pub_date__gte=datetime.date.today())
  • 每次筛选一个查询集,得到的都是全新的另一个查询集,它和之前的查询集之间没有任何绑定关系。每次筛选都会创建一个独立的查询集,它可以被存储及反复使用。如下:这三个查询集都是独立的。
>>> q1 = Entry.objects.filter(headline__startswith="What")
>>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>>> q3 = q1.filter(pub_date__gte=datetime.date.today())
  • 查询集 是惰性执行的 —— 创建查询集不会带来任何数据库的访问。直到查询集需要求值时,Django 才会真正运行这个查询。
  • 可以使用字段查询,指定字段范围,形式为field__lookuptype=value。(中间是两个下划线)。
Entry.objects.filter(pub_date__lte='2006-01-01')
Entry.objects.get(headline__exact="Man bites dog")
Blog.objects.get(name__iexact="beatles blog")
Entry.objects.get(headline__contains='Lennon')

  大约有二十多种查询的类型。查询条件中指定的字段必须是模型字段的名称。但有一个例外,对于ForeignKey你可以使用字段名加上_id 后缀。

Entry.objects.filter(blog_id=4)
  • 多表关联查询:Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔。
#from django.db import models

#class Blog(models.Model):
# name = models.CharField(max_length=100) #class Author(models.Model):
# name = models.CharField(max_length=50) #class Entry(models.Model):
# blog = models.ForeignKey(Blog)
# authors = models.ManyToManyField(Author) Entry.objects.filter(blog__name='Beatles Blog')

 这种跨越可以是任意的深度。它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。

Blog.objects.filter(entry__headline__contains='Lennon')
  • 如果知道只有一个对象满足你的查询,可以使用管理器get() 方法,它直接返回该对象:
one_blog = Blog.objects.get(pk=1)

  如果没有结果满足查询,get() 将引发一个DoesNotExist 异常。类似地,如果有多条记录满足get() 的查询条件,Django 也将报错。这种情况将引发MultipleObjectsReturned异常。

  • 可以使用切片和索引限制查询集。
#切片
Blog.objects.all()[5:10]
Blog.objects.all()[:10:2]
#索引
Blog.objects.order_by('headline')[0]

  通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询。有一个例外,是如果你使用Python 切片语法中"step"参数。

  • 其他常用的查询API包括:

    • order_by:对查询结果排序。
    • reverse:对查询结果反向排序。
    • distinct:从返回结果中剔除重复记录。
    • values:返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象。
    • values_list:与values() 类似,只是在迭代时返回的是元组而不是字典。
    • count:返回在数据库中对应的 QuerySet.对象的个数。
    • first,last,earliest,latest:返回QuerySet.对象的第一、最后、最早、最近的一条记录。
    • exists:如果QuerySet 包含任何结果,则返回True,否则返回False
  • 聚合函数和分组函数:
    • aggregate()QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。
>>> from django.db.models import Avg, Max, Min
>>> Book.objects.aggregate(average_price=Avg('price'), Max('price'), Min('price'))
{'average_price': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
    • 逐个对象的汇总结果可以由annotate()子句生成。当annotate()子句被指定之后,QuerySet中的每个对象都会被注上特定的值。与 aggregate() 不同的是, annotate() 不是一个终止子句。annotate()子句的返回结果是一个查询集 (QuerySet);这个 QuerySet可以用任何QuerySet方法进行修改,包括 filter()order_by(), 甚至是再次应用annotate()
# Build an annotated queryset
>>> from django.db.models import Count
>>> q = Book.objects.annotate(num_authors=Count('authors'))
>>> q[0].num_authors
2
>>> q[1].num_authors
1
    • 在聚合函数中指定聚合字段时,Django 允许你使用同样的 双下划线 表示关联关系;也同样可以用关联模型的小写名称和双下划线表示"反转"关系。
  • 使用Q 对象进行复杂的查询:Q 对象可以使用& 和| 操作符组合起来,可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询。

Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
  • 比较对象:为了比较两个模型实例,只需要使用标准的Python 比较操作符,即双等于符号:==。在后台,它会比较两个模型主键的值。

5.删除对象

  delete()方法将立即删除对象且没有返回值。

Entry.objects.filter(pub_date__year=2005).delete()

  注意,delete() 是唯一没有在管理器 上暴露出来的查询集方法。这是一个安全机制来防止你意外地请求Entry.objects.delete(),而删除所有 的条目。如果你确实想删除所有的对象,你必须明确地请求一个完全的查询集:

Entry.objects.all().delete()

6.复制对象

  最简单的方法是,只需要将pk 设置为None。 

blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1 blog.pk = None
blog.save() # blog.pk == 2

  

 

Django数据操作的更多相关文章

  1. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  2. Django 链接MySQL及数据操作

    Django 链接MySQL Django创建的项目自带的数据库是SQLite3,我们想要链接MySQL的话,需要更改settings.py中的配置 1.在MySQL中创建好数据库,Django项目不 ...

  3. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  4. Django——8 关系表的数据操作 表关联对象的访问 多表查询

    Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...

  5. 1122 django属性操作orm字段数据操作

    目录 1. 静态文件的配置 手动静态文件的访问资源 静态文件的动态绑定 2.request方法 2.1 请求方式 2.2 获取前端的请求方式 request.method 2.3 request方法 ...

  6. Django模型基础(三)——关系表的数据操作

    模型之间可以有三种表关系,即一对一,一对多和多对多.表关联之间的数据操作在Django中可以很方便的操作到.在模型中,表关联的字段类型是关联表的实例,而不是字段本身类型.关联字段在数据库中会在其后补上 ...

  7. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  8. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  9. django中操作cookie与session

    cookie 什么是Cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息. Cookie的 ...

随机推荐

  1. Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)

    这些术语都是指屏幕的分辨率. VGA:Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA:Half-size VGA:即:VGA的一半,分辨率为480× ...

  2. Support Facades

    Support Facades Introduction Facades provide a "static" interface to classes that are avai ...

  3. 关于"干货集中营"的一个开源App

    中秋佳节,玩了一天,撸了两天代码,搞出这么个东东,共享出来,小伙伴们如果有兴趣,欢迎添砖加瓦. 数据接口为干货集中营的数据,接口地址:http://gank.io/api 使用到的技术清单如下: 1. ...

  4. css实现“固定表头带滚动条”的table

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. hunnu 11313 无重复元素序列的最长公共子序列转化成最长递增子序列 求法及证明

    题目:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11313 湖师大的比赛,见我的另一篇水题题解,这里要说的 ...

  6. Azure PowerShell 创建虚拟机

    # 指定订阅名称$subscriptionName="订阅名称"# 指定云服务名称$serviceName="云服务名称"# 指定用来保存虚拟机VHD的存储$s ...

  7. 【总结】教你怎么将centos7打造成桌面系统

    http://tieba.baidu.com/p/3379447850 centos吧

  8. smarty中的变量使用

    在模板中输出动态数据可以用{},所以容易与css中的标签相互冲突,所以使用{literal}{/literal}标签包起来就不会用模板的解析方式解析,变量的来源有三种,用assign方法赋值,系统保留 ...

  9. 使用 ICharpCode.SharpZipLib 压缩指定目录结构

    今天做项目中遇见一个压缩问题,我的目录结构是树形菜单,文件在服务器存储是平面存储,没有目录结构,所以在下载指定目录的时候要构建目录结构,如下: 当我右键点击下载b目录文件夹的时候要Download   ...

  10. C#学习笔记6:各种字符串问题

    1.字符串 逐字字符串字面量:字符串前加@,不仅将反斜杠当做普通字符来处理,而且还会逐字解释所有空白字符. 如: Class Triangle { Static void Main() { Syste ...