python-django 数据库查询方法大全

简介:   __exact 精确等于 like ‘aaa’  __iexact 精确等于 忽略大小写 ilike ‘aaa’  __contains 包含 like ‘%aaa%’  __icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。

  __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=modelsField()

  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

  这是model,有blog,author,以及entry;其中entry分别与blog与author表关 联,entry与blog表是通过 外键(models.ForeignKey())相连,属于一对多的关系,即一个entry对应多个blog,entry与author是多对多的关系, 通过modles.ManyToManyField()实现。

  一、插入数据库,用save()方法实现,如下:

  >>> from mysite.blog.models import Blog

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

  >>> b.save()1234

  二、更新数据库,也用save()方法实现,如下:

  >> b5.name=‘New name’

  >> b5.save()123

  保存外键和多对多关系的字段,如下例子:

  更新外键字段和普通的字段一样,只要指定一个二手游戏账号交易对象的正确类型。

  >>> cheese_blog=Blog.objects.get(name=”Cheddar Talk”)

  >>> entry.blog=cheese_blog

  >>> entry.save()1234

  更新多对多字段时又一点不太一样,使用add()方法添加相关联的字段的值。

  >> joe=Author.objects.create(name=”Joe”)

  >> entry.authors.add(joe)123

  三、检索对象

  >>> Blog.objects

  >>> b=Blog(name=’Foo’, tagline=’Bar’)

  >>> b.objects

  Traceback:

  …

  AttributeError: “Manager isn’t accessible via Blog instances.”12345678

  1、检索所有的对象

  >>> all_entries=Entry.objects.all()12

  使用all()方法返回数据库中的所有对象。

  2、检索特定的对象

  使用以下两个方法:

  fileter(**kwargs)

  返回一个与参数匹配的QuerySet,相当于等于(=).

  exclude(**kwargs)

  返回一个与参数不匹配的QuerySet,相当于不等于(!=)。

  Entry.objects.filter(pub_date__year=2006)

  12

  不使用Entry.objects.all().filter(pub_date__year=2006),虽然也能运行,all()最好再获取所有的对象时使用。

  上面的例子等同于的sql语句:

  select * from entry where pub_date_year=’2006′12

  链接过滤器:

  >>> Entry.objects.filter(

  … headline__startswith=’What’

  … ).exclude(

  … pub_date__gte=datetime.now()

  … ).filter(

  … pub_date__gte=datetime(2005, 1, 1)

  … )12345678

  最后返回的QuerySet是headline like ‘What%’ and put_date2005-01-01

  另外一种方法:

  >> q1=Entry.objects.filter(headline__startswith=”What”)

  >> q2=q1.exclude(pub_date__gte=datetime.now())

  >> q3=q1.filter(pub_date__gte=datetime.now())1234

  这种方法的好处是可以对q1进行重用。

  QuerySet是延迟加载

  只在使用的时候才会去访问数据库,如下:

  >>> q=Entry.objects.filter(headline__startswith=”What”)

  >>> q=q.filter(pub_date__lte=datetime.now())

  >>> q=q.exclude(body_text__icontains=”food”)

  >>> print q12345

  在print q时才会访问数据库。

  其他的QuerySet方法

  >>> Entry.objects.all()[:5]12

  这是查找前5个entry表里的数据

  >>> Entry.objects.all()[5:10]12

  这是查找从第5个到第10个之间的数据。

  >>> Entry.objects.all()[:10:2]12

  这是查询从第0个开始到第10个,步长为2的数据。

  >>> Entry.objects.order_by(‘headline’)[0]12

  这是取按headline字段排序后的第一个对象。

  >>> Entry.objects.order_by(‘headline’)[0:1].get()12

  这和上面的等同的。

  >>> Entry.objects.filter(pub_date__lte=’2006-01-01′)12

  等同于SELECT * FROM blog_entry WHERE pub_date <=’2006-01-01′;

  >>> Entry.objects.get(headline__exact=”Man bites dog”)12

  等同于SELECT … WHERE headline=‘Man bites dog’;

  >>> Blog.objects.get(id__exact=14) # Explicit form

  >>> Blog.objects.get(id=14) # __exact is implied123

  这两种方式是等同的,都是查找id=14的对象。

  >>> Blog.objects.get(name__iexact=”beatles blog”)12

  查找name=”beatles blog”的对象,不去饭大小写。

  Entry.objects.get(headline__contains=’Lennon’)

  等同于SELECT … WHERE headline LIKE ‘%Lennon%’;

  startswith 等同于sql语句中的 name like ‘Lennon%’,

  endswith等同于sql语句中的 name like ‘%Lennon’.

  >>> Entry.objects.filter(blog__name__exact=’Beatles Blog’)

  12

  查找entry表中外键关系blog_name=’Beatles Blog’的Entry对象。

  >>> Blog.objects.filter(entry__headline__contains=’Lennon’)12

  查找blog表中外键关系entry表中的headline字段中包含Lennon的blog数据。

  Blog.objects.filter(entry__author__name=’Lennon’)

  12

  查找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)

  123

  查询的是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)123

  这两种查询在某些情况下是相同的,某些情况下是不同的。第一种是限制所有的blog数据的,而第二种情况则是第一个filter是

  限制blog的,而第二个filter则是限制entry的

  >>> Blog.objects.get(id__exact=14) # Explicit form

  >>> Blog.objects.get(id=14) # __exact is implied

  >>> Blog.objects.get(pk=14) # pk implies id__exact

  等同于select * from where id=14

  # Get blogs entries with id 1, 4 and 7

  >>> Blog.objects.filter(pk__in=[1,4,7])

  等同于select * from where id in{1,4,7}

  # Get all blog entries with id > 14

  >>> Blog.objects.filter(pk__gt=14)

  等同于select * from id>14

  >>> Entry.objects.filter(blog__id__exact=3) # Explicit form

  >>> Entry.objects.filter(blog__id=3) # __exact is implied

  >>> Entry.objects.filter(blog__pk=3) # __pk implies __id__exact

  这三种情况是相同的

  >>> Entry.objects.filter(headline__contains=’%')

  等同于SELECT … WHERE headline LIKE ‘%\%%’;

  Caching and QuerySets

  >>> print [e.headline for e in Entry.objects.all()]

  >>> print [e_date for e in Entry.objects.all()]

  应改写为:

  >> queryset=Poll.objects.all()

  >>> print [p.headline for p in queryset] # Evaluate the query set.

  >>> print [p_date for p in queryset] # Re-use the cache from the evaluation.、123456789101112131415161718192021222324252627282930

  这样利用缓存,减少访问数据库的次数。

  四、用Q对象实现复杂的查询

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

  等同于WHERE question LIKE ‘Who%’ OR question LIKE ‘What%’

  Poll.objects.get(

  Q(question__startswith=’Who’),

  Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))

  )

  等同于SELECT * from polls WHERE question LIKE ‘Who%’ AND (pub_date=’2005-05-02′ OR pub_date=’2005-05-06′)

  Poll.objects.get(

  Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),

  question__startswith=’Who’)

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

  五、比较对象

  >>> some_entry==other_entry

  >>> some_entry.id==other_entry.id123

  六、删除

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

  b=Blog.objects.get(pk=1)

  # This will delete the Blog and all of its Entry objects.

  b.delete()

  Entry.objects.all().delete()

  删除所有123456789

  七、一次更新多个值

  # Update all the headlines with pub_date in 2007.Entry.objects.filter(pub_date__year=2007).update(headline=’Everything is the same’)

  >>> b=Blog.objects.get(pk=1)

  # Change every Entry so that it belongs to this Blog.

  >>> Entry.objects.all().update(blog=b)

  如果用save()方法,必须一个一个进行保存,需要对其就行遍历,如下:for item in my_queryset:

  item.save()12345678910

  关联对象

  one-to-many

  >>> e=Entry.objects.get(id=2)

  >>> e.blog # Returns the related Blog object.>>> e=Entry.objects.get(id=2)

  >>> e.blog=some_blog

  >>> e.save()

  >>> e=Entry.objects.get(id=2)

  >>> e.blog=None

  >>> e.save() # “UPDATE blog_entry SET blog_id=NULL …;”>>> e=Entry.objects.get(id=2)

  >>> print e.blog # Hits the database to retrieve the associated Blog.>>> print e.blog # Doesn’t hit the database; uses cached version.>>> e=Entry.objects.select_related().get(id=2)

  >>> print e.blog # Doesn’t hit the database; uses cached version.>>> print e.blog # Doesn’t hit the database; uses cached version>>> 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()

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

  You cannot access a reverse ForeignKey Manager from the class; it must be accessed from an instance:>>> Blog.entry_setadd(obj1, obj2, …)

  Adds the specified model objects to the related object set.

  create(**kwargs)

  Creates a new object, saves it and puts it in the related object set. Returns the newly created object.

  remove(obj1, obj2, …)

  Removes the specified model objects from the related object set.

  clear()

  Removes all objects from the related object set.

  many-to-many类型:

  e=Entry.objects.get(id=3)

  e.authors.all() # Returns all Author objects for this Entry.e.authors.count()

  e.authors.filter(name__contains=’John’)

  a=Author.objects.get(id=5)

  a.entry_set.all() # Returns all Entry objects for this Author.one-to-one 类型:

  class EntryDetail(models.Model):

  entry=models.OneToOneField(Entry)

  details=models.TextField()

  ed=EntryDetail.objects.get(id=2)

  ed.entry # Returns the related Entry object使用sql语句进行查询:

  def my_custom_sql(self):

  from django.db import connection

  cursor=connection.cursor()

  cursor.execute(“SELECT foo FROM bar WHERE baz=%s”, [self.baz])

  row=cursor.fetchone()

  return row

目录
相关文章
|
11天前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
26天前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
32 10
|
28天前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
69 21
|
29天前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
23 4
|
1月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
141 77
|
2月前
|
存储 小程序 Python
农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序
### 农历节日倒计时:基于Python的公历与农历日期转换及节日查询小程序 该程序通过`lunardate`库实现公历与农历的日期转换,支持闰月和跨年处理,用户输入农历节日名称后,可准确计算距离该节日还有多少天。功能包括农历节日查询、倒计时计算等。欢迎使用! (239字符)
225 86
|
2月前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
2月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
2月前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
410 5
|
3月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
165 3

热门文章

最新文章

推荐镜像

更多