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

首先是一些文档性的帮助

  1. __exact 精确等于 like aaa
  2. __iexact 精确等于 忽略大小写 ilike aaa
  3. __contains 包含 like ‘%aaa%’
  4. __icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains
  5. __gt 大于
  6. __gte 大于等于
  7. __lt 小于
  8. __lte 小于等于
  9. __in 存在于一个list范围内
  10. __startswith 以…开头
  11. __istartswith 以…开头 忽略大小写
  12. __endswith 以…结尾
  13. __iendswith 以…结尾,忽略大小写
  14. __range 在…范围内
  15. __year 日期字段的年份
  16. __month 日期字段的月份
  17. __day 日期字段的日
  18. __isnull=True/False
  19. __isnull=True __exact=None的区别

然后是列一些实例:

  1. class Blog(models.Model):
  2. name = models.CharField(max_length=100)
  3. tagline = models.TextField()
  4.  
  5. def __unicode__(self):
  6. return self.name
  7.  
  8. class Author(models.Model):
  9. name = models.CharField(max_length=50)
  10. email = models.EmailField()
  11.  
  12. def __unicode__(self):
  13. return self.name
  14.  
  15. class Entry(models.Model):
  16. blog = models.ForeignKey(Blog)
  17. headline = models.CharField(max_length=255)
  18. body_text = models.TextField()
  19. pub_date = models.DateTimeField()
  20. authors = models.ManyToManyField(Author)
  21.  
  22. def __unicode__(self):
  23. return self.headline

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

  对对象的一些操作:

  

增加:

  通过save()方法

  1. from mysite.blog.models import Blog
  2.  
  3. b = Blog(name=’Beatles Blog’, tagline=’All the latest Beatles news.’)
  4. b.save()

修改:

  也可通过save方法

  1. b5.name = New name
  2. b5.save()

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

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

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

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

查找:

  检索所有对象:

  

  1. all_entries = Entry.objects.all()

  

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

  QuerySet方法

    

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

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

  

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

  Q对象的复杂查询 

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

删除:

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

反向查询:

  先展示一个model

  

  1. from django.db import models
  2.  
  3. class Publisher(models.Model):
  4.  
  5. name = models.CharField(max_length=30)
  6. address = models.CharField(max_length=50)
  7. city = models.CharField(max_length=60)
  8. state_province = models.CharField(max_length=30)
  9. country = models.CharField(max_length=50)
  10. website = models.URLField()
  11.  
  12. def __unicode__(self):
  13. return self.name
  14.  
  15. class Author(models.Model):
  16.  
  17. first_name = models.CharField(max_length=30)
  18. last_name = models.CharField(max_length=40)
  19. email = models.EmailField()
  20.  
  21. def __unicode__(self):
  22. return u'%s %s' % (self.first_name, self.last_name)
  23. class Book(models.Model):
  24.  
  25. title = models.CharField(max_length=100)
  26. authors = models.ManyToManyField(Author)
  27. publisher = models.ForeignKey(Publisher)
  28. publication_date = models.DateField()
  29.  
  30. def __unicode__(self):
  31. return self.title

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

  反向查询方法:

  

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

  访问多对多:

  1. 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. SIM800C Couldn't pair with xxx because of an incorrect PIN or passkey

    /******************************************************************************* * SIM800C Couldn't ...

  2. X-Mirage苹果屏幕录制工具7天试用期破解 imsoft.cnblogs

    X-Mirage (PC) 能让你的 Windows 变成一个 iPhone.iPad 或者 iPod Touch 的屏幕镜像,应用程序.游戏.照片.视频等等一切可以在 iOS 移动端显示的东西,都镜 ...

  3. 20155229 2016-2017-2 《Java程序设计》第八周学习总结

    20155229 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章 NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以设定缓冲区 ...

  4. 详解Hadoop Slots的含义

    Slots是Hadoop的一个重要概念.然而在Hadoop相关论文,slots的阐述难以理解.网上关于slots的概念介绍也很少,而对于一个有经验的Hadoop开发者来说,他们可能脑子里已经理解了sl ...

  5. log4j的格式化打印

    log4j.properties的文件内容如下 log4j.rootLogger=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleA ...

  6. Oracle误删除表空间的恢复

    对于误删除表空间的恢复,本文通过基于数据库的时间点恢复和基于表空间的时间点恢复分别加以讨论 一 通过基于数据库的时间点恢复被误删除的表空间 1 需要注意的事项 a 基于数据库的时间点恢复将会回退整个数 ...

  7. package.json 文件中的版本号

    版本号,格式:"主要版本,次要版本,补丁版本" 指定版本:比如1.2.2,遵循"主版本,次要版本,补丁版本"的格式规定,安装时只安装指定版本. 波浪号(tild ...

  8. Django Admin 时间格式化

    http://961911.blog.51cto.com/951911/1557218 修改settings.py,添加一下内容: USE_L10N = False DATETIME_FORMAT = ...

  9. MyBatis持久层框架使用总结 转载

    MyBatis持久层框架使用总结   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  10. opencv中的滤波

    以前的时候,为了过滤图像中的一些噪点,学过一些简单的滤波,比如中值滤波,均值滤波,也是自己实现的. 在opencv中有现成的函数可以调用,实现滤波的操作. 函数的原型如下: CVAPI(void) c ...