Model使用

首先安装MySQL的python连接驱动,windows下安装可下下载,对应python-2.7:
https://code.google.com/p/soemin/downloads/detail?name=MySQL-python-1.2.3.win32-py2.7.exe&can=2&q=
 
简单的,先展示在view中使用mysql数据库操作
from django.shortcuts import render_to_response
import MySQLdb

def book_list(request):
    db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
    cursor = db.cursor()
    cursor.execute('SELECT name FROM books ORDER BY name')
    names = [row[0] for row in cursor.fetchall()]
    db.close()
    return render_to_response('book_list.html', {'names': names})

 
以上的做法比较原始,也有一些弊端:
1. 硬编码数据库连接参数,理想情况下,这些应该放到配置文件中去
2. 固定流程,总是打开连接,创建游标,关闭连接这几步,重复代码太多
3. 绑定mysql数据库,如果要切换别的数据库,修改太多了,要改连接参数,没准SQL语句也要修改
 
而Django数据库API就是为了解决以上问题而生。
from django.shortcuts import render_to_response
from mysite.books.models import Book

def book_list(request):
    books = Book.objects.order_by('name')
return render_to_response('book_list.html', {'books': books})

 
首先要在settings.py文件进行数据库的设定
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'test', # 数据库名称,如果使用sqlite3,则输入数据库文件路径,如'/home/django/mydata.
        'USER': 'root', # Not used with sqlite3.
        'PASSWORD': 'admin', # Not used with sqlite3.
        'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '', # Set to empty string for default. Not used with sqlite3.
    }
}
 
一旦设置好数据库信息,可以使用python manage.py shell进行测试
>>> from django.db import connection
>>> cursor = connection.cursor()
如果不报错,则说明配置正常。
 
下面简单介绍一下project和app之间的区别:
1. project是一系列app集合的一个实例,外加对这些app的配置信息。
确切地说,project只需要提供一个配置文件,包括数据库连接信息,所安装的app的列表,模板路径等等
2. app是一系列Django提供的功能的可重用的集合,一般包括在同一个包中的modesl, views。
例如,一个Django project可以由很多个app组成,如一个评论系统,一个后台管理系统等,所有这些app
都可以在不同的project中重用,是独立的,当然也要看你的设计了。。。
 
然而app不是非要不可的,view+template+urlconf就足可以组建project,但是为了追求可重用性,以及想使用
Django强大的database level api--model,就一定要创建app,使用以下命令:
python manage.py startapp books
 
有人认为在python中重新定义一个数据表中的字段信息,是不是有点冗余,如果直接使用数据库本身的自省操作
在运行时,来确定数据模型的话,是不是更方便?
答案是错误的,
1. 后者因为是在运行时,如果每一个请求都在去自省一下数据库的表结构,这样就会产生额外的开销,
给系统造成负担。
2. 再者,把表结构写在python代码,容易管理和操作。
3. 然后,数据库中的数据类型比较单一,而Django中的数据类型丰富,比如邮件地址类型,网址类型等,
都可以提高生产力。。。
 
用python代码来表示数据表信息的做法有一个缺点就是一定要保持和数据库表信息一致,如果一方修改,
都需要进行修改。
 
使用model的一般步骤:
1. 在app的models文件中创建model子类
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()
2. 然后在settings.py中注册你的app
MIDDLEWARE_CLASSES = (
    # 'django.middleware.common.CommonMiddleware',
    # 'django.contrib.sessions.middleware.SessionMiddleware',
    # 'django.contrib.auth.middleware.AuthenticationMiddleware',
)
 
INSTALLED_APPS = (
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.sites',
    'books', #注意加上这个逗号来区分元组类型,同时记得是要用引号。。。
)
3. 可以使用命令来验证你的设置,0 errors代表正确
python manage.py validate
 
4. 通过model类定义来创建数据库表,可以使用命令:
python manage.py sqlall books #打印出创建相应的数据表的SQL语句
python manage.py syncdb #直接执行SQL语句,只用来检查是否表存在,如果没有,就创建新的表,
如果model中的数据有改动,这一句执行就没有用。
 
5. 使用model进行简单的数据表插入操作,Django直到save()才是真正地写入数据库。
python manage.py shell
>>> from books.models import Publisher
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
... city='Berkeley', state_province='CA', country='U.S.A.',
... website='http://www.apress.com/')
>>> p1.save()
使用manager进行查询
>>> publisher_list = Publisher.objects.all() #Publisher.objects返回的就是一个管理器
>>> publisher_list
[<Publisher: Publisher object>, <Publisher: Publisher object>]
这样就可以进行取出记录数据的操作,或者是你自己定义的其它逻辑操作
>>> publisher_list[0].address
u'2855 Tele Avenur'
 
如果想直接写入数据库,不用save(),则使用管理器的create()方法
>>> p1 = Publisher.objects.create(name='Apress',
... address='2855 Telegraph Avenue',
... city='Berkeley', state_province='CA', country='U.S.A.',
... website='http://www.apress.com/')
 
6. 在model的类中,增加__unicode__()函数,来代表各个类的字符串表示信息。相当于java中的toString()
def __unicode__(self):
    return self.name
>>>[<Publisher: Apress>, <Publisher: O'Reilly>]
 
7. 更新的操作,就是简单的赋个新值,再save()一下
不过这样做效率一般,manager有update函数专门用于更新操作
>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')
 
8. 条件选择操作,使用manager中的filter函数,返回的是QuerySet对象,类似结果集对象
>>> Publisher.objects.filter(name='Apress')
[<Publisher: Apress>]
 
更复杂的条件选择操作,是使用Django特有的lookup type修饰词来实现
>>> Publisher.objects.filter(name__contains="press")
[<Publisher: Apress>]
__contains:类似SQL语句中的like的模糊匹配操作:
WHERE name LIKE '%press%';
 
如果想获取单一的对象,使用get()函数,如果返回的对象有多个,就报错MultipleObjectsReturned。
如果返回值为空,也报错DoesNotExist。
>>> a = Publisher.objects.get(name="Apress")
>>> a
<Publisher: Apress>
>>> a.address
u'2855 Tele Avenur'
也可以进行取出记录数据的相应操作,就相当于取出了一个Publisher记录的对象。
 
9. 排序操作
>>> Publisher.objects.order_by("state_province", "address")
[<Publisher: Apress>, <Publisher: O'Reilly>]
 
>>> Publisher.objects.order_by("-name") #'-'表示倒序
 
QuerySet也可以像列表那样用索引取值
Publisher.objects.order_by("address")[1]
但是不支持负数
Publisher.objects.order_by("address")[-1]
不过可以用倒序来表示:
Publisher.objects.order_by("-address")[0]
 
10. 删除记录操作
对于单个model类或者是QuerySet类都有对应的delete()函数
>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.filter(country='USA').delete()
>>> Publisher.objects.all().delete()#如果要清空数据表,一就要显示地调用all(),再delete

Django——Model的使用的更多相关文章

  1. 【转】Django Model field reference学习总结

    Django Model field reference学习总结(一) 本文档包含所有字段选项(field options)的内部细节和Django已经提供的field types. Field 选项 ...

  2. Django model字段类型清单

    转载:<Django model字段类型清单> Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField ...

  3. Django:Model的Filter

    转自:http://www.douban.com/note/301166150/   django model filter 条件过滤,及多表连接查询.反向查询,某字段的distinct   1.多表 ...

  4. Django model中 双向关联问题,求帮助

    Django model中 双向关联问题,求帮助 - 开源中国社区 Django model中 双向关联问题,求帮助

  5. django 自定用户系统 以及 Django Model 定义语法

    http://www.tuicool.com/articles/jMzIr2 django使用自己的用户系统 http://www.jianshu.com/p/c10be59aad7a Django ...

  6. tornado with MySQL, torndb, django model, SQLAlchemy ==> JSON dumped

    现在,我们用torndo做web开发框架,用他内部机制来处理HTTP请求.传说中的非阻塞式服务. 整来整去,可谓之一波三折.可是,无论怎么样,算是被我做成功了. 在tornado服务上,采用三种数据库 ...

  7. Django Model field reference

    ===================== Model field reference ===================== .. module:: django.db.models.field ...

  8. Django model对象接口

    Django model查询 # 直接获取表对应字段的值,列表嵌元组形式返回 Entry.objects.values_list('id', 'headline') #<QuerySet [(1 ...

  9. Django学习之四:Django Model模块

    目录 Django Model 模型 MODEL需要在脑子里记住的基础概念 区分清楚,必须不能混淆的 class Meta 内嵌元数据定义类 简单model创建实例 数据源配置 接着通过models在 ...

  10. Django Model Form

    ModelForm ModelForm结合了Form和Model,将models的field类型映射成forms的field类型,复用了Model和Model验证, 写更少的代码,并且还实现了存储数据 ...

随机推荐

  1. V4L2 camera 驱动 capture测试程序【转】

    转自:http://blog.csdn.net/kickxxx/article/details/6336346 在网上找了一个测试程序, 看了看,是根据capture.c修改的.测试步骤如下 . gc ...

  2. 深入解析Linux内核I/O剖析(open,write实现)

    Linux内核将一切视为文件,那么Linux的文件是什么呢?其既可以是事实上的真正的物理文件,也可以是设备.管道,甚至还可以是一块内存.狭义的文件是指文件系统中的物理文件,而广义的文件则可以是Linu ...

  3. 1.tornado基础

    import tornado.web ''' tornado基础web框架模块 ''' import tornado.ioloop ''' tornado的核心循环IO模块,封装了linux的epol ...

  4. Python基础-列表、元祖

    1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ['Alex',"Tenglan",'Eric ...

  5. HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  6. UVA——11988 Broken Keyboard (a.k.a. Beiju Text)

    11988 Broken Keyboard (a.k.a. Beiju Text)You’re typing a long text with a broken keyboard. Well it’s ...

  7. lua的table.sort

    local aa = {{a=11},{a=44},{a=33},{a=2} } table.sort(aa,function(a,b) return a.a>b.a end) for k, v ...

  8. Java混乱的日志体系(logback)(转)

    作为一名 Java 程序员,日常开发工作中肯定会接触日志系统,但是众多的框架,包括 Log4j.Log4j2.Logback.Slf4j.Apache Common logging 等等,引用的 ma ...

  9. 【spring boot】spring boot 2.0 项目中使用mysql驱动启动创建的mysql数据表,引擎是MyISAM,如何修改启动时创建数据表引擎为【spring boot 2.0】

    默认创建数据表使用的引擎是MyISAM 2018-05-14 14:16:37.283 INFO 7328 --- [ restartedMain] org.hibernate.dialect.Dia ...

  10. IMAP 命令

    最近学习了一下IMAP命令,现在也算总结一下学习的东西,先说说IMAP命令,如果你使用的是163.126邮箱,反正是网易家的邮箱,那么这里就有很多坑要踩了,因为网易邮箱的特殊性,由于网易邮箱在中国占有 ...