python-django-ORM,常用查询方式

介绍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的区别

然后是列一些实例:

 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()方法

from mysite.blog.models import Blog

b = Blog(name=’Beatles Blog’, tagline=’All the latest Beatles news.’)
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)。

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

查找:

  检索所有对象:

  

 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         )

删除:

Entry.objects.filter(pub_date__year=2005).delete()
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

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

  反向查询方法:

  

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)2 b.authors.all()

  

    

时间: 2024-10-10 07:05:48

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

python web-Django ORM常用查询方式

Django默认自带的ORM功能非常强大,调用执行的方法去查询即可,不需要自己去写SQL了. 常用参数 __exact 精确等于 like 'aaa' __iexact 精确等于 忽略大小写 ilike 'aaa' __contains 包含 like '%aaa%' __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains. __gt 大于 __gte 大于等于 __lt 小于 __lte 小于等于 __

Django - - 基础 - - Django ORM常用查询语法及进阶

目录 一般操作 必知必会13条 单表查询之神奇的双下划线 ForeignKey操作 正向查找 反向操作 ManyToManyField class RelatedManager 聚合查询和分组查询 聚合 分组 F查询和Q查询 F查询 Q查询 锁和事务 锁 事务 其他鲜为人知的操作(有个印象即可) Django ORM执行原生SQL QuerySet方法大全 Django终端打印SQL语句 在Python脚本中调用Django环境 1, 一般操作 官网文档:https://docs.djangop

Python - Django - ORM 分组查询补充

单表查询: models.py: from django.db import models class Employee(models.Model): name = models.CharField(max_length=16) age = models.IntegerField() salary = models.IntegerField() province = models.CharField(max_length=32) dept = models.CharField(max_lengt

django ORM常用查询条件

假设有一个模型 class Article(models.Model): title=models.CharField(max_length=50) content=models.TextField() class Meta: db_table='book' 对于查询结果是结果集,即通过filter进行查询所得的对象来说,可通过query属性来查看django转换之后的原生sql语句 -- article=Article.objects.filter(title='Hello World') p

django orm 常用查询筛选

大于.大于等于 __gt 大于 __gte 大于等于 User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户 User.objects.filter(age__gte=10) // 查询年龄大于等于10岁的用户 小于.小于等于 __lt 小于 __lte 小于等于 User.objects.filter(age__lt=10) // 查询年龄小于10岁的用户 User.objects.filter(age__lte=10) // 查询年龄小于等于10岁的用

八、Python Django数据库添加查询

Python Django数据库添加查询 对数据进行操作 一.创建记录 # pwd /root/csvt03 # ipython manage.py shell In [1]: from blog.models import Employee #(第一种方法) In [2]: Employee Out[2]: blog.models.Employee In [3]: emp = Employee() In [4]: emp.name = 'Alen' In [5]: emp.save() #(第

Django ORM常用字段及参数

目录 Django ORM常用字段及参数 models中的常用字段 字段内的关键字参数 数据库查询优化(面试问题) Django ORM如何开启事务操作 MTV与MVC模型(了解) Django ORM常用字段及参数 models中的常用字段 models中常用字段与数据库中的对应关系 models中常用字段 数据库对应字段 AutoField(primary_key=True) 主键字段 CharField(max_length=32) varchar(32) IntegerField() i

Django—ORM常用字段和参数

一.ORM常用的字段和参数 1.0 常用字段 # AutoField: int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. # IntegerField: 一个整数类型,范围在 -2147483648 to 2147483647.(一般不用它来存手机号(位数也不够),直接用字符串存,) # CharField: 字符类型,必须提供max_length参数, max_length表示字符长度 # DateField: 日期字

django orm 的查询条件

Django的ORM查询操作: 查询数据库操作是一个非常重要的技术.在Django中,查询一般就是使用filter.exclude.get三个方法来实现,在调用这些方法的时候传递不同的参数来实现查询需求. 在mysql中,想要查询数据,就需要使用where关键字加上字段条件去查询,在Django的orm之中,我们使用filter.exclude.get关键词加上field+__+condition作为关键词去查询,现在我们就来介绍一下这里的condition: 注:查询原生SQL语句: 1.在q