创建对象

使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中

pub_obj = models.Publisher(title='奥利给出版社')
pub_obj.save() //该方法没有返回值

上面的代码在背后执行了SQL 的Insert语句。 在你显式调用save()之前,Django 不会访问数据库。

如果你想只用一条语句创建并保存一个对象,使用create()方法。

将更改保存到对象

要保存对数据库中已存在的对象的改动,请使用save()。

假设Publisher的一个实例pub_obj已经被保存在数据库中,下面这个例子将更改它的name并且更新数据库中的记录:

>>> pub_obj.name = '哈麻皮出版社'
>>> pub_obj.save()

上面的代码在背后执行SQL 的UPDATE语句。 在你显式调用save()之前,Django 不会访问数据库。

链式过滤器

QuerySet的筛选结果本身还是QuerySet,所以可以将筛选语句链接在一起

models.Author.objects.filter(xxx).exclude(xxx)

限制QuerySet

可以使用Python 的切片语法来限制QuerySet记录的数目 。 它等同于SQL 的OFFSET 和LIMIT子句。

例如,下面的语句返回前面5 个对象(LIMIT 5):

>>> Author.objects.all()[:5]

下面这条语句返回第6 至第10 个对象(OFFSET 5 LIMIT 5):

>>> Author.objects.all()[5:10]

不支持负的索引(例如Author.objects.all()[-1])。

字段查找

常用字段

__lte  //小于等于
__lt //小于
_id //查找外键id为xxx的对象
__exact //精准匹配 如果你没有提供查询类型 —— 即如果你的关键字参数不包含双下划线 —— 默认假定查询类型是exact。iexact 忽略大小写 __contains //包含 icontains忽略大小写
__in //在给定的列表里
__startswith //以什么开头 istartswith不区分大小写
__endswith //以什么结尾 iendswith不区分大小写
__range //范围测试(包含于之中)
__isnull //值为 False 或 True, 相当于 SQL语句IS NULL和IS NOT NULL.

跨表查询

Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理join。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

>>> Blog.objects.filter(entry__headline='Lennon')

注:__表示跨一张表

关联对象

正向查询

>>> e = Entry.objects.get(id=2)
>>> e.blog # 返回blog关系管理对象
>>> e.blog.all # 返回blogQuerySet

反向查询

如果模型有一个ForeignKey,那么该ForeignKey所指的模型实例可以通过一个Manager返回第一个模型的所有实例。 默认情况下,这个Manager的名字为FOO_set,其中FOO是源模型的小写名称。 该Manager返回QuerySets,可以用上一节提到的方式进行过滤和操作。

例如:

>>> b = Blog.objects.get(id=1)
>>> b.entry_set.all() # Returns all Entry objects related to Blog. # b.entry_set is a Manager that returns QuerySets.
>>> b.entry_set.filter(headline__contains='Lennon')
>>> b.entry_set.count()

你可以在ForeignKey定义时设置related_name参数来覆盖FOO_set 的名称。 例如,如果Entry模型更改为blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries'),上述示例代码如下所示:

>>> b = Blog.objects.get(id=1)
>>> b.entries.all() # Returns all Entry objects related to Blog. # b.entries is a Manager that returns QuerySets.
>>> b.entries.filter(headline__contains='Lennon')
>>> b.entries.count()

处理关系管理对象的其他方法

add(obj1, obj2, ...)

添加一指定的模型对象到关联的对象集中。

create(**kwargs)

创建一个新的对象,将它保存并放在关联的对象集中。 返回新创建的对象。

remove(obj1, obj2, ...)

从关联的对象集中删除指定的模型对象。

clear()

从关联的对象集中删除所有的对象。

set(objs)

替换相关对象集。

ORM常见操作

filter  //返回一个新的QuerySet,它包含满足查询参数的对象
exclude //返回一个新的QuerySet,它包含不满足给定的查找参数的对象
order_by //排序,-号为降序,默认升序
reverse //反转
distinct //去重
values //返回QuerySet,里面包含字典对象
values_list // 返回QuerySet,里面包含元组
count //返回个数
exists //判断是否存在
first //返回第一个对象
last //返回最后一个对象
delete //删除

Q

在filter()中的关键字参数查询 — 是“AND”的关系。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q对象。

Q(question__startswith='Who') | Q(question__startswith='What') //|取或
~Q(pub_date__year=2005) // ~取反

F

一个 F()对象代表了一个model的字段值或注释列。 使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。

相反,Django使用F()对象生成描述数据库级所需操作的SQL表达式。

from django.db.models import F

reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()

F()表达式的效率上的优点主要体现在

  • 直接通过数据库操作而不是Python
  • 减少数据库查询次数

最新文章

  1. TAQSkinScrollBar 类美化滚动条再讨论
  2. cacert.pem
  3. 【转载】解决Windows 10 局域网内共享的问题
  4. java 多线程(ThreadPoolExecutor (补充))
  5. redis 列出所有的键
  6. 字符编码 and cpp
  7. web farm 讨论引出
  8. uva10943
  9. linux获取目录下文件
  10. 比较有用的log4j.properties
  11. fzu 1911 Construct a Matrix(矩阵快速幂+规律)
  12. js变量数组
  13. JavaScript高级程序设计-10.11: DOM及其扩展
  14. javascript中=,==,与===的区别;以及特殊值NaN的讲解
  15. Django(三) ORM操作
  16. JavaScript验证输入的字符是否包含表情
  17. 微信小程序如何实现和微信客服通话?
  18. 要使用myConfig.properties配置文件作为实体类的映射文件的话,格式要用=,最关键的要和实例类中通过反射获取值的KEY要一样,不样会反射取不到值
  19. Android sdcard文件读写操作
  20. Codeforces 1133 F2. Spanning Tree with One Fixed Degree 并查集+生成树

热门文章

  1. PHP date_create() 函数
  2. RectTransform的localPosition与anchoredPosition(3D)的区别
  3. java中的枚举类enum
  4. angular2+ 组件间通信
  5. Spring事务专题(三)事务的基本概念,Mysql事务处理原理
  6. 打开IDEA后tomcat不能用,Cannot load project of unknown project type,无法加载类或者项目
  7. 02-java实现单链表
  8. HourglassNet
  9. Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现
  10. C#LeetCode刷题之#258-各位相加(Add Digits)