DjangoBook笔记-2
## date: 2010-4-13 09:30 8. 数据库配置 setting.py中关于数据库配置的部分: DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. DATABASE_NAME = '' # Or path to database file if using sqlite3. DATABASE_USER = '' # Not used with sqlite3. DATABASE_PASSWORD = '' # Not used with sqlite3. DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. 对于SQLite数据,仅需指定 DATABASE_ENGINE = 'sqlite3' # 使用sqlite3引擎 DATABASE_NAME = 'djangotest.sqlite' #文件名自定义 即可完成配置,下一阶段探索配置并学习postgresql 9. 创建子应用 从技术上讲,project是负责提供项目配置的,包括数据库连接、app列表等待 而app是一套功能集合,包括模型和视图 在"mysite"项目文件夹下创建books应用程序app python manage.py startapp books 这样就在mysite下建立books文件夹,目录结构: books/ __init__.py models.py tests.py views.py 这样数据模型就可以在models.py中进行定义了 10. 建立数据模型 官方演示的例子: from django.db import models 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() class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() Publisher就相当于数据库中的表: CREATE TABLE "books_publisher" ( "id" serial NOT NULL PRIMARY KEY, "name" varchar(30) NOT NULL, "address" varchar(50) NOT NULL, "city" varchar(60) NOT NULL, "state_province" varchar(30) NOT NULL, "country" varchar(50) NOT NULL, "website" varchar(200) NOT NULL ); 11. 数据模型的安装 模型安装就是将books在settings.py的INSTALLED_APPS中指定 INSTALLED_APPS = ( # 'django.contrib.auth', # 'django.contrib.contenttypes', # 'django.contrib.sessions', # 'django.contrib.sites', 'mysite.books', ) 12. 模型的验证 有效性验证: python manage.py validate SQL验证: python manage.py sqlall books SQL验证会生产建立表的SQL语句,这些表默认都会自动建立一个id字段的 "id" serial NOT NULL PRIMARY KEY sqlall只是生产了sql语句,并没有真正建立表 数据库建立表 python manage.py syncdb # 也就是同步模型到数据库中 13. 数据的使用 这个比较重要,通过前面的安装已经在数据库和程序中指定好了数据结构,\ 下一步既是数据的使用了 13.1 基本数据访问 在Shell中创建两个Publisher实例并调用 >>> 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() # 这里才真正保存了p1对象 >>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.', ... city='Cambridge', state_province='MA', country='U.S.A.', ... website='http://www.oreilly.com/') >>> p2.save() >>> publisher_list = Publisher.objects.all() >>> publisher_list [<Publisher: Publisher object>, <Publisher: Publisher object>] 上面在调用object.all后仅仅得到的是两个实例展示, 获得字符串表现的展示方法为在模型实体中加入__unicode__对象: 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() def __unicode__(self): return self.name # 这样再展示实例时会显示name出来 这样再调用对象,展示结果为: >>> publisher_list [<Publisher: Apress>, <Publisher: O‘Reilly>] # O'Reilly 其他对象方法同上 13.2 插入和更新数据 插入数据的方法前面的例子即是,主要要调用对象的save()方法来保存 更新的方法: >>> p1.name = 'Apress Publishing' >>> p1.save() 13.3 数据过滤 数据过滤也就是指定WHERE进行选择 选择所以对象的方法: Publisher.objects.all() 使用过滤: >>> Publisher.objects.filter(name='Apress') [<Publisher: Apress>] 多个条件: >>> Publisher.objects.filter(country="U.S.A.", state_province="CA") [<Publisher: Apress>] 模糊查找 默认情况下使用filter并指定name=则使用的是精确查找,要模糊查找: Publisher.objects.filter(name__contains="press") 使用name__contains就等价于 WHERE name LIKE '%press%' 除contains外,还有其他一些类型的过滤查找: icontains # 大小写无关的LIKE startswith # 'press%' endswith # '%press' range # between 13.4 获取单个对象 上面使用filter后返回的是list,要返回单个对象可以使用get方法 Publisher.objects.get(name='Apress') 如果指定条件后返回的对象多于一个会抛出异常:MultipleObjectsReturned 同样没有返回值的话也会抛出异常:DoesNotExist 排除异常的一个应用: try: p = Publisher.objects.get(name='Apress') except Publisher.DoesNotExist: print "Apress isn't in the database yet." else: print "Apress is in the database." 13.5 数据排序 使用order_by()方法实现排序 Publisher.objects.order_by("address") Publisher.objects.order_by("state_province", "address") 逆序 Publisher.objects.order_by("-name") 缺省选择排序,即在数据模型实体定义时加入Meta方法: 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() def __unicode__(self): return self.name class Meta: ordering = ['name'] 13.6 连锁查询 Publisher.objects.filter(country="U.S.A.").order_by("-name") 13.7 限制返回数量 Publisher.objects.order_by('name')[0] # 相当于 LIMIT 1 Publisher.objects.order_by('name')[0:2] # OFFSET 0 LIMIT 2 13.8 更新多个对象 单个对象更新前面已有例子 p.name = 'Apress Publishing' p.save() 改动任意对象的更新,即结合filter进行: Publisher.objects.filter(id=5).update(name='Apress Publishing') Publisher.objects.all().update(country='USA') 13.9 删除对象 删除对象使用对象的delete()方法 强调:删除需谨慎! p = Publisher.objects.get(name="O'Reilly") p.delete() Publisher.objects.filter(country='USA').delete() Publisher.objects.all().delete()