自学Django点滴记录(三)
2013-08-05
模型 Django数据库层
Django数据驱动Web应用的总体设计:鼓励松耦合以及对应用程序中不同部分的严格分割。
如在视图函数中通过模板系统把业务逻辑和表现逻辑分隔开。
MVC(Model—View—Controller)
model:数据存取层; 由Django数据库层处理。
View:系统中选择显示什么和怎么显示的部分;由视图和模板处理。
Controller:系统中根据用户输入并视需要访问模型;根据URLconf设置。
Django也被称为MTV(model-Template-View)框架。
数据库配置
我使用mysql数据库。默认配置文件:settings.py 参数:DATABASES
测试是否配置正确:
>manage.py shell
>>>from django.db import connection
>>>cursor = connection.cursor()
>>>
无异常,说明配置正确。测试前要确保mysql服务已经启动。
Django app
>manage.py startapp app_name #创建一个app_name目录
一个project包含很多个Django app以及对它们的配置;
一个app是一套Django功能的集合,通常包含模型和视图;它很容易移植到其他project和被多个project复用。
系统对app的约定:如果使用了Django的数据库层,就必须创建一个Django app,该模型必须存放在app中。
关于模型:
它是用python代码形式表述的数据在数据库中的定义。
如果你修改了一个Django模型,你要自己修改数据库来保证和模型同步。
同时,Django提供了实用工具来从现有的数据库中自动扫描生成模型。
第一个实例
>django-admin.py startproject proj_name
并手动创建views.py,配置setting.py中的参数:DATABASES
>manage.py runserver
通过浏览器查看http://127.0.0.1:8000/是否开始工作。 It worked,继续。
在views.py中编写视图函数,在urls.py中添加patterns参数,通过浏览器按照访问名规则查看。It worked,继续。
>manage.py startapp app_name
在models.py中编写需要的模型。文件中每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。
关于主键,除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段。
每个Django模型都要求有单独的主键。
在settings.py中编辑 INSTALLED_APPS、MIDDLEWARE_CLASSES。
>manage.py validate
作用:验证模型的有效性,检查模型的语法和逻辑是否正确。It worked,继续。
>manage.py sqlall app_name
作用:只是把SQL语句段打印出来,让我们看到Django究竟会做什么。并没有真正在数据库中创建数据库表。
>manage.py syncdb
作用:它会根据INSTALLED_APPS里设置的app来检查数据库,如果表不存在,就会创建它。
注意:此命令不能将模型的修改或删除同步到数据库,只能新增。它不会重复执行SQL语句。
问:如何指定数据库表创建的位置? 只能是默认路径吗?
基本数据访问
通过模型类名访问相关属性。如模型类名为Publisher—models中的一个类。
objects属性被称为管理器。
1、Publisher.objects.all():获取数据库中Publisher类的所有对象。
返回一个列表集
2、Publisher.objects.create(...):完成对象的创建与存储至数据库。
3、插入、更新数据(update数据库语句)
4、选择对象 (明言胜于暗示)
5、数据过滤
Publisher.objects.filter(...):根据关键字参数来转换成where数据库语句。有多个参数时会被转换成and数据库语句。
返回一个列表集
6、获取单个对象
Publisher.objects.get(...):如果查询没有结果会抛出DoesNotExist异常。
返回单个对象
7、数据排序
Publisher.objects.order_by(...):参数可以给多个。在参数前加一个减号可以进行逆向排序。
8、**class Meta:**
在任意一个模型类中使用Meta类来设置一些与特定模型相关的选项。如:
class Publisher(models.Model):
...
...
def __unicode__(self):
return self.name
**class Meta:**
**ordering = ['name']**
9、连锁查询
Publisher.objects.filter(...).order_by(...):同时进行过滤和排序查询的操作。转换成SQL语句是where和order by的组合。
返回一个列表集。
10、限制返回的数据
Publisher.objects.order_by(...)[i]:通过索引值i得到某一数据。索引值>=0。
11、更新多个对象
Publisher.objects.filter(...).update(...):和save()方法更新所有列相比,
我们调用结果集(QuerySet)对象的 update()方法更新指定列。
返回值是一个整型数值,表示受影响的记录条数。
12、删除对象
p = Publisher.objects.get(...)
p.delete()
or
Publisher.objects.filter(...).delete()
Publisher.objects.all().delete() :要求在删除表内所有数据时显示使用all()
浙公网安备 33010602011771号