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. [Effective C++ --024]若所有参数皆需类型转换,请为此采用non-member函数

    引言 假设我们有这样的类: class A{ public: A(, ) {}; int num() const; int den() const; const A operator* (const ...

  2. Jquery的$命名冲突

    在Jquery中,$是JQuery的别名,所有使用$的地方也都可以使用JQuery来替换,如$('#msg')等同于JQuery('#msg')的写法.然而,当我们引入多个js库后,在另外一个js库中 ...

  3. WinServer 之 发布WebService后调用出现" The test form is only available for requests from the local machine. "

    当您尝试从远程计算机访问 Web 服务时,不会显示“调用”按钮.并且,您会收到以下错误信息: The test form is only available for requests from the ...

  4. Objective-C中系统宏的用法总结

    先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等 宏变量: 先举一个例子,会用到上面这些宏: #define mypri ...

  5. posix thread API列表

    互斥量: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_init(pthread_mutex_t *mutex ...

  6. Linux修改 DNS

    前不久服务器上遇到一些问题,需要修改服务器的dns配置,写下来记下,笔者使用的说centos 6.5. DNS的配置文件在/etc/resolv.conf,但一般情况下修改后重启服务 service ...

  7. javascript中new Date浏览器兼容性处理

    看下面的代码 <script type="text/javascript"> var dt1 = new Date('2016-3-4 11:06:12'); aler ...

  8. js ie8不支持项总结

    不支持filter,trim  要用jquery 的$filter,$trim 数组不能用for in 要用for 数组没有indextOf方法 不能使用关键字,如true ,default IE8 ...

  9. Better Completion插件使用

    最近学习Bootstrap,发现Sublime text2不支持Bootstrap的代码提示,所以得装一个Bootstrap的代码提示插件.试了好几个之后发现Better-Completion最方便, ...

  10. mvn常见命令

    http://www.cnblogs.com/adolfmc/archive/2012/07/31/2616908.html 创建一个简单的Java工程:mvn archetype:create -D ...