django之model操作初级篇
1、django中数据库引擎是在settings.py文件中配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
- ENGINE告诉django使用那个数据库引擎。本例中使用SQLite,默认数据库引擎
- NAME告诉django数据的名称。
2、项目和应用之间的区别:一个是配置,一个是代码
- 一个项目是一系列Django应用的实例,外加那些应用的配置。严格来说一个项目唯一需要的是一个设定文件,定义数据库连接信息、安装的应用列表、DIRS,等等。
- 一个应用是一系列边写的django功能,通常包含模型和视图。打包在一个python包里面。django自带了一些应用,例如管理后台。这些应用的determined指出是便携,可以在多个项目中复用。
3、python代替SQL定义数据模型的原因:
- 内省(introspection)有开销,而且不完美。为了提供便利的数据访问(api),Django需要已某种方式知晓数据库布局,而这一需求有两种实现方式。第一种是使用Python明确描述数据,第二种是在运行是内省数据库,推知数据模型。第二种方式在一个地方存储表的元数据,看似更简单,其实会导致几个问题。首先运行是内兴建数据库肯定有消耗。如果每次执行请求,或者只是初始化Webn服务器都要内省数据库,那带来的消耗是无法接受的。其次,有些数据库,尤其是旧版MySQL,存储的元数据不足以完成内省。
- Python编写起来让人心情舒畅,而且使用Python编写所有代码无需频繁让大脑切换情景。在一个编程环境(思维)中待久了,有助于提高效率。在SQL和Python之间换来换去容易打断状态。
- 把数据模型保存在代码中比保存在数据库中易于做版本控制,易于跟踪数据布局的变化。
- SQL对数据布局的元数据只有部分支持。例如,多数数据库系统没有提供专门表示电子邮件地址或URL的数据类型。而Django模型有。高层及的数据结构有助于提升效率,让代码更便于福复用。
- 不同数据库平台使用的SQL不一致。
- 缺点:模型的Python代码可能与数据库的真正结构脱节。
4、创建图书模型:
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=32) address = models.CharField(max_length=64) city = models.CharField(max_length=64) state_province = models.CharField(max_length=32) country = models.CharField(max_length=64) website = models.URLField() def __str__(self): return self.name class Author(models.Model): first_name = models.CharField(max_length=32) last_name = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return '%s %s' % (self.first_name,self.last_name) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey('Publisher',to_field='id') publication_date = models.DateField() def __str__(self): return self.title
添加数据:Publisher.objects.create(name="O'Reilly",address='10 Fawcett St.',city='Cambridge',state_province='MA',country='U.S.A',website='http://www.oreilly.com')
获取全部数据:Publisher.objects.all()
objects属性,叫管理器(manager)。管理器负责所有“表层”数据操作,包括(最重要的)数据查询。所有模型都自动获得一个objects管理器,需要查询模型实例时都要使用它。
all方法,是objects管理器的一个方法,返回数据库中的所有行。返回的是一个QuerySet。
获取特定数据:Publisher.objects.filter(id='xxx')
filter过滤数据,返回的也是一个QuerySet对象
检索单个对象:Publisher.objects.get(name='Apress') 返回的只是一个对象。
排序数据,使用order_by()方法:Publisher.objects.order_by('name'),可以多个参数排序;倒序在字段名前面加上“-”(减号):Publisher.objects.order_by('-name').
虽然order_by()有一定的灵活性,但是每次都调用它相当频繁。多数时候,我们时钟使用一个字段排序。可以在模型中指定默认排序:
class Publisher(models.Model): name = models.CharField(max_length=32) address = models.CharField(max_length=64) city = models.CharField(max_length=64) state_province = models.CharField(max_length=32) country = models.CharField(max_length=64) website = models.URLField() def __str__(self): return self.name class Meta: ordering=['name']
这里出现了一个新概念,内嵌在Publisher类定义体中的class Meta。任何模型都可以使用Meta类指定多个针对所在模型的选项。
链式查找:Publisher.objects.filter(country="U.S.A.").order_by("-name")
切片数据:Publisher.objects.order_by('name')[0]
数据更新:
第一种方法: p = Publisher.objects.get(name='Apress') p.name = 'Apress Publishing' p.save() 第二种方法: Publisher.objects.filter(id=52).update(name='Apress Publishing')
删除数据:
第一种方法: p = Publisher.objects.get(name="O'Reilly") p.delete() 第二种方法: Publisher.objects.filter(country='USA').delete() Publisher.objects.all().delete()