`
kaozjlin
  • 浏览: 117442 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

Django 数据库操作

 
阅读更多

__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

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

二、更新数据库,也用save()方法实现,如下:
>> b5.name = ‘New name’
>> b5.save()

保存外键和多对多关系的字段,如下例子:
更新外键字段和普通的字段一样,只要指定一个对象的正确类型。
>>> cheese_blog = Blog.objects.get(name=”Cheddar Talk”)
>>> entry.blog = cheese_blog
>>> entry.save()

更新多对多字段时又一点不太一样,使用add()方法添加相关联的字段的值。
>> joe = Author.objects.create(name=”Joe”)
>> entry.authors.add(joe)

三、检索对象

>>> Blog.objects

>>> b = Blog(name=’Foo’, tagline=’Bar’)
>>> b.objects
Traceback:

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

1、检索所有的对象

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

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

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

Entry.objects.filter(pub_date__year=2006)
不使用Entry.objects.all().filter(pub_date__year=2006),虽然也能运行,all()最好再获取所有的对象时使用。
上面的例子等同于的sql语句:
slect * from entry where pub_date_year=’2006′

链接过滤器:
>>> Entry.objects.filter(
… headline__startswith=’What’
… ).exclude(
… pub_date__gte=datetime.now()
… ).filter(
… pub_date__gte=datetime(2005, 1, 1)
… )

最后返回的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())
这种方法的好处是可以对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 q
在print q时才会访问数据库。

其他的QuerySet方法
>>> Entry.objects.all()[:5]
这是查找前5个entry表里的数据

>>> Entry.objects.all()[5:10]
这是查找从第5个到第10个之间的数据。

>>> Entry.objects.all()[:10:2]
这是查询从第0个开始到第10个,步长为2的数据。

>>> Entry.objects.order_by(‘headline’)[0]
这是取按headline字段排序后的第一个对象。

>>> Entry.objects.order_by(‘headline’)[0:1].get()
这和上面的等同的。

>>> Entry.objects.filter(pub_date__lte=’2006-01-01′)
等同于SELECT * FROM blog_entry WHERE pub_date <= ’2006-01-01′; >>> Entry.objects.get(headline__exact=”Man bites dog”)
等同于SELECT … WHERE headline = ‘Man bites dog’;

>>> Blog.objects.get(id__exact=14) # Explicit form
>>> Blog.objects.get(id=14) # __exact is implied
这两种方式是等同的,都是查找id=14的对象。

>>> Blog.objects.get(name__iexact=”beatles blog”)
查找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’)
查找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.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.pub_date for e in Entry.objects.all()]
应改写为:
>> queryset = Poll.objects.all()
>>> print [p.headline for p in queryset] # Evaluate the query set.
>>> print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.、
这样利用缓存,减少访问数据库的次数。

四、用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)))

五、比较对象

>>> some_entry == other_entry
>>> some_entry.id == other_entry.id

六、删除

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()
删除所有

七、一次更新多个值

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

关联对象

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_set

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

分享到:
评论

相关推荐

    Python-Django模型字段加密解密您的数据并加密保存至数据库中

    默认情况下,Django将模型字段的值作为明文存储在数据库中。为了加密这些字段,我们需要自定义字段类,或者使用已有的第三方库。 luojilab-django-mirage-field-5d96836是一个这样的库,它提供了一种简单的方法来...

    Python个人博客系统django源代码,个人网站系统源程序源码+数据库(毕业设计)

    Python个人博客系统django源代码,个人网站系统源程序源码+数据库(毕业设计),该项目是个人毕设项目,答辩评审分达到98分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。该资源主要...

    django 删除数据库表后重新同步的方法

    而migrate命令则是用于应用迁移,即执行迁移文件中的数据库操作,从而更新数据库结构。 在文章中,作者描述了在开发过程中删除了数据库表后,尝试使用makemigrations和migrate命令重新同步数据库时遇到的问题。具体...

    Django Web框架源码下载

    使用 Django,我们在几分钟之内就可以创建高品质、易维护、数据库驱动的应用程序。 Django框架的核心组件有: 1、用于创建模型的对象关系映射 2、为最终用户设计的完美管理界面 3、一流的URL设计 4、设计者友好的...

    Django数据库操作之save与update的使用

    在Django框架中,数据库操作是通过ORM(对象关系映射)进行的,这使得开发者可以使用Python代码来处理数据库事务,而无需直接编写SQL语句。本文将深入探讨Django中`save()`和`update()`两个方法在数据库操作中的应用...

    Django数据库内省工具通过数据表名就可以动态创建一个即时可用的Djangomodels对象

    在Python的Web开发领域,Django是一个非常流行的框架,它提供了强大的功能,包括数据库操作、模板引擎、URL路由等。本篇文章将详细讲解如何利用Django的数据库内省(Introspection)工具,通过已有的数据表名动态...

    python使用Django库向mysql数据库插入数据

    本教程将详细介绍如何使用Django与MySQL协同工作,实现数据的插入操作。 首先,确保你已经安装了Python、Django和MySQL的相关库。Python的安装是基础,Django可以通过pip来安装:`pip install django`。对于MySQL,...

    Django 数据库项目 车辆租凭系统

    总的来说,这个项目涵盖了Django Web开发的多个核心概念,包括模型定义、视图处理请求、模板渲染页面、数据库操作以及项目结构管理。对于初学者来说,通过这个项目可以深入理解Django框架的工作原理,掌握数据库设计...

    Django 数据库同步操作技巧详解

    通过本文的介绍,我们可以了解到Django数据库同步操作的重要性以及如何有效利用Django提供的工具进行数据库的管理和维护。正确理解和使用这些命令,不仅可以提高开发效率,还能避免许多潜在的问题。 #### 六、扩展...

    Django 数据库表的建立与增删查改

    在本篇文章中,我们将详细探讨Django框架中如何建立和管理数据库表,以及如何在这些表中执行增删查改操作。Django作为一个高级Python Web框架,它鼓励快速开发和干净、实用的设计。它负责了很多底层的复杂工作,使得...

    django数据库自动重连的方法实例

    需要注意的是,这个库并不处理所有类型的数据库操作,特别是事务或`autocommit=False`的非自动提交情况下。在这些场景下,如果连接丢失,可能不会立即尝试重连,因为这可能导致未提交的更改丢失。因此,建议在处理...

    django 数据库连接模块解析及简单长连接改造方法

    在进行django数据库连接模块解析及简单长连接改造方法的讨论前,首先需了解django框架中数据库连接管理的基本原理。Django使用ORM(对象关系映射)来与数据库进行交互,这允许开发者使用Python代码来操作数据库,而...

    解决django同步数据库的时候app models表没有成功创建的问题

    在实际开发中,应确保所有必要的数据库操作都被正确地记录在迁移文件中,并且这些迁移文件能够被Django正确地识别和执行。 通过上述步骤,如果一切顺利,应该可以解决在Django同步数据库时app models表没有成功创建...

    凝思系统+django+达梦数据库

    利用Django的ORM(对象关系映射)进行数据库操作。 7. **数据库迁移**: 运行`python manage.py makemigrations`生成迁移文件,然后执行`python manage.py migrate`将模型同步到数据库。 8. **视图和模板**: ...

    Django数据库操作的实例(增删改查)

    创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_length=32) code = models.CharField(max_length=32) 1.增加 方法一 models.Business.objects.create...

    PythonDjango支持像PostgresCitus这样的分布式多租户数据库

    Django的ORM允许开发者用Python代码操作数据库,而无需编写SQL,这样可以简化开发流程并提高可移植性。 为了在Django项目中使用Citus,我们需要安装`citus` PostgreSQL扩展,并在Django的数据库配置中指定Citus连接...

    django英文官方.rar

    **二、Django数据库操作** Django内置了对象关系映射(ORM)系统,支持多种数据库,如SQLite、MySQL、PostgreSQL等。ORM提供了一种用Python代码操作数据库的方式,简化了SQL查询的编写。 **三、Django表单(Forms...

    Django引用ztree实现数据库表导入树状目录

    在本例中,我们需要从数据库中读取数据表,这可以通过Django的ORM(对象关系映射)系统实现,它允许我们以Python对象的方式操作数据库。 3. ZTree插件: ZTree是一款基于JavaScript的树形插件,适用于Web前端展示...

    Python、web、数据库、正则表达式、Django

    综上所述,这份达内的学习资源涵盖了Python语言基础、Web开发(重点是Django框架)、数据库操作(特别是SQLite)和正则表达式使用等关键知识点。通过深入学习这些内容,不仅可以提升Python编程技能,还能掌握构建Web...

    python-django

    ### Django 数据库操作 Django 自带了 ORM(对象关系映射),使得与数据库交互变得简单。通过模型类定义的数据可以直接进行 CRUD(创建、读取、更新、删除)操作,无需编写 SQL 查询。此外,Django 提供了管理命令...

Global site tag (gtag.js) - Google Analytics