前言
最近有项目需要用python,以前看过,但忘记得太快了,遂打算通过玩玩django来熟悉python。大家都说django非常适合快速开发,我做java web,所以很想知道django是实现快速开发的。
我打算实现对url的CRUD,在本文中记录下来容易出问题的地方,以备忘。
正文
在django的MVC中,M代表了Model类,用来定义基础bean和db操作;V则用django自有的template系统来代替,C则由非常自由灵活的ROOT_URLCONF来充当。并且django的哲学是:我为你准备好做web开发所需的所有组件,包括国际化、缓存、ORM、模板、安全等,你不需要其他的了!所以,用django会与ta提供的组件绑在一起,比如要用sqlalchemy来替换django的ORM框架就非常麻烦(这个我没试过)。
什么是Model
在django中,Model代表了Bean,同时也包括与数据库的各种操作。比如查找数据库中所有的Site,直接定义Site类:
class Site(models.Model)
然后调用Site.objects.all()就可以得到所有的Site。其中Site.objects,其实返回的是一个QuerySet对象,这个对象虽然不是list类型,但因其实现了__iter__()方法,所以可以像list一样遍历。
Model中需要定义属性,比如type = models.IntegerField(),表示其有个type属性,这个属性是一个Integer,django直接将Integer对应于数据库的int类型。而且Model不但可以对应数据库,甚至可以影响V。比如:type = models.IntegerField(choices=TYPE_CHOICES, default=1),表示type属性虽然是一个int,但在显示时,这个字段其实是一个单选下拉列表,而且默认显示第一个值。
django的ORM--Model和db table之间的互换
django提供了非常方便的ORM框架,不但可以做到不写SQL来做CRUD,还可以做到根据db tabel生成Model类,以及从定义的Model类生成db table。
django提供syncdb命令,可以自动检测项目内的Model,然后在数据库中生成相应的db table;相对应,inspectdb提供扫描数据库表,提供Model的源码(只是输出在标准输出中),但有一个问题就是inspectdb生成的Model源码,需要自己把里面Model定义的顺序理清楚。
Model如何进一步影响显示
django中本来是有Form类的,专门负责View和template,但Form跟Model之间没什么关系,尤其是很多情况下,Form和Model里的field定义都非常相似,增加了不少工作量,所以django提供了ModelForm类,这个类基于Model类,同时兼有Form类的功能,能将Model里的field直接在template里显示。
Form非常适合做添加、编辑这些功能,因为django的template中可以用form.as_table/form.as_ul/form.as_p来直接构造一个form,非常方便。
定义方式是:加入有个Site类作为Model,需要定义一个:
class SiteForm(ModelForm):
class Meta:
model = Site
可能这时,就有人会问:这种直上直上的方式,很不利于修改数据库或者修改View;很多时候你会听到:DAO,VO,DTO,POJO都应该独立分开!把DAO一致传递到VO的方式,即影响性能,又不方便开发。所以,django的ModelForm允许对Model中field的显示进行定制,比如:
1.可以用fields来表示要显示的fields列表;
2.可以用exclude来表示不显示的fields列表;
3.可以用widgets标签来定制field的显示方式;
(未完待续)