介绍django model 的一些常用查询方式

首先是一些文档性的帮助

__exact 精确等于 like ‘aaa’
__iexact 精确等于 忽略大小写 ilike ‘aaa’
__contains 包含 like ‘%aaa%’
__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__isnull=True 与 __exact=None的区别

然后是列一些实例:

 class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() def __unicode__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField() def __unicode__(self):
return self.name class Entry(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateTimeField()
authors = models.ManyToManyField(Author) def __unicode__(self):
return self.headline

  这里一个Entry关联一个blog和多个Authors

  对对象的一些操作:

  

增加:

  通过save()方法

from mysite.blog.models import Blog

b = Blog(name=’Beatles Blog’, tagline=’All the latest Beatles news.’)
b.save()

修改:

  也可通过save方法

  b5.name = ‘New name’
b5.save()

  关于有外键的,可以直接通过参数列表或者赋值后save.

 cheese_blog = Blog.objects.get(name=”Cheddar Talk”)
entry.blog = cheese_blog
entry.save()

  关于有多对多关系的,不能直接更新,需要model实例.多对多关系的成员名.add(model)。

joe = Author.objects.create(name=”Joe”)
entry.authors.add(joe)

查找:

  检索所有对象:

  

 all_entries = Entry.objects.all()

  

  检索特定的对象
    使用以下两个方法:
    fileter(**kwargs)
    返回一个与参数匹配的QuerySet,相当于等于(=).
    exclude(**kwargs)
    返回一个与参数不匹配的QuerySet,相当于不等于(!=)。

  QuerySet方法

    

 # 这是查找前5个entry表里的数据
Entry.objects.all()[:5]
# 这是查找从第5个到第10个之间的数据。
Entry.objects.all()[5:10]
# 这是查询从第0个开始到第10个,步长为2的数据。
Entry.objects.all()[:10:2]
# 模糊查询
Entry.objects.get(headline__contains=’Lennon’)

  接下来是一些ORM提供的比较酷的方法:

  

 Entry.objects.filter(blog__name__exact=’Beatles Blog’)
# 查找entry表中外键关系blog_name=’Beatles Blog’的Entry对象。
Blog.objects.filter(entry__headline__contains=’Lennon’)
# 查找blog表中外键关系entry表中的headline字段中包含Lennon的blog数据。
Blog.objects.filter(entry__author__name=’Lennon’)
# 查找blog表中外键关系entry表中的author字段中包含Lennon的blog数据。
Blog.objects.filter(entry__author__name__isnull=True)
Blog.objects.filter(entry__author__isnull=False,entry__author__name__isnull=True)
# 查询的是author_name为null的值 Blog.objects.filter(entry__headline__contains=’Lennon’,entry__pub_date__year=2008)
Blog.objects.filter(entry__headline__contains=’Lennon’).filter( entry__pub_date__year=2008)
# 这两种查询在某些情况下是相同的,某些情况下是不同的。第一种是限制所有的blog数据的,而第二种情况则是第一个filter是
# 限制blog的,而第二个filter则是限制entry的 Blog.objects.filter(pk__in=[1,4,7])
# id in 1,4,7
Blog.objects.filter(pk__gt=14)
# id = 14

  Q对象的复杂查询 

 Q(question__startswith=’Who’) | Q(question__startswith=’What’)

 Poll.objects.get(Q(question__startswith=’Who’),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)

删除:

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

反向查询:

  先展示一个model

  

 from django.db import models

 class Publisher(models.Model):

     name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField() def __unicode__(self):
return self.name class Author(models.Model): first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField() def __unicode__(self):
return u'%s %s' % (self.first_name, self.last_name)
class Book(models.Model): title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField() def __unicode__(self):
return self.title

  一个作者一本书和一个出版社,一本书可以被多个作者撰写,但是只属于一个出版社

  反向查询方法:

  

p = Publisher.objects.get(name='Apress Publishing')
p.book_set.filter(name__icontains='django')
# 属性名称book_set是由模型名称的小写 ( 如 book) 加_set组成的。
# 通过出版社,得到与它有外键关联的书籍名称叫django的书

  访问多对多:

1 b = Book.objects.get(id=50)
b.authors.all()

  

    

python-django-ORM,常用查询方式的更多相关文章

  1. Django orm 常用查询筛选总结

    本文主要列举一下django orm中的常用查询的筛选方法: 大于.大于等于 小于.小于等于 in like is null / is not null 不等于/不包含于 其他模糊查询 model: ...

  2. Python - Django - ORM 分组查询补充

    单表查询: models.py: from django.db import models class Employee(models.Model): name = models.CharField( ...

  3. Python - Django - ORM F查询和Q查询

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  4. Python - Django - ORM 聚合查询和分组查询

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  5. django ORM常用查询条件

    假设有一个模型 class Article(models.Model): title=models.CharField(max_length=50) content=models.TextField( ...

  6. python - django (ORM常用字段)

    # """ python manage.py makemigrations # 更新操作 python manage.py migrate # 转换sql语句到数据库 1 ...

  7. Python - Django - ORM 常用的字段属性

    字段参数: null:用于表示某个字段可以为空 unique:如果设置为 unique=True,则该字段在此表中必须是唯一的 db_index:如果 db_index=True,则代表着为此字段设置 ...

  8. Python - Django - ORM 常用字段

    AutoField: int 自增列,必须填入参数 primary_key=True 如果没有写 AutoField,则会自动创建一个列名为 id 的列 from django.db import m ...

  9. django orm 常用查询筛选

    大于.大于等于 __gt 大于 __gte 大于等于 User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户 User.objects.filter(age__ ...

  10. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

随机推荐

  1. 统计学(检验、分布)的 python(numpy/pandas/scipy) 实现

    scipy 中统计相关的 api:https://docs.scipy.org/doc/scipy/reference/stats.html https://zhuanlan.zhihu.com/p/ ...

  2. ubuntu16.04 中文输入法

    https://blog.csdn.net/qq_21792169/article/details/53152700 在主文件夹目录即home目录,按快捷键Ctrl+H(显示隐藏文件),看到的.bas ...

  3. Python实现不同格式打印九九乘法表

    前言:最近在学习Python,学习资源有慕课网上的视频教程.菜鸟教程以及Python官方文档tutorial.虽然了解了Python的基本语法,但是还没有真正意义上输出自己写的代码.代码小白,之前仅学 ...

  4. 安装Scipy出错的解决方法

    lapack_opt_info: lapack_mkl_info: libraries mkl_rt not found in ['c:\\python27\\lib', 'C:\\', 'c:\\p ...

  5. goss 简单快捷的服务器测试检验工具

    goss 是一个简单.快捷的服务器测试检验工具,dgoss 是一个包装可以支持基于容器的开发模式 同时可以暴露测试结果为一个http endpoint,比较方便. 使用goss容器运行 使用数据卷的模 ...

  6. asp.net excel 操作

    /// <summary> /// 数据操作 /// </summary> /// <param name="fileName"></pa ...

  7. VisualSVN安装配置与使用

    VisualSVN安装配置与使用 1.  所选服务器安装包:VisualSVN-Server-2.1.3.msi. 2.  客户端安装包:TortoiseSVN-1.6.2.16344-win32-s ...

  8. Aria2+yaaw+Chrome插件BaiduExporter实现百度网盘下载

    Aria2+yaaw+Chrome插件BaiduExporter实现百度网盘下载 这篇博客主要为了解决百度网盘下载限速以及linux等操作系统无百度客户端的问题.主要包括两个方面第一个是aria2的安 ...

  9. FastAdmin 插件刷新缓存出现 200 红色提示框解决 always_populate_raw_post_data

    使用 phpStudy 全新安装了 FastAdmin,PHP 版本是 5.6. 安装完成后在刷新插件缓存时出现红色 提示消息,但状态 为 200. 打开 F12 看,发现有以下信息. <br ...

  10. RAC4——架构和变化

    1.RAC的架构 2.由单实例变RAC的变化   1.SGA的变化: 和传统的单实例相比,RAC 实例中SGA最显著的变化时多了一个GRD(Global resource directory)部分. ...