[Django实战] 第6篇 - 模型(ORM)
2013-09-10 19:56
441 查看
前面我们实现了用户认证模块,在该模块里其实已经涉及到模块(ORM),但由于是Django自带的,大部分它都已经帮我们处理好,对于我们来说是透明的,本篇,我们将自己定义模型。
在Web开发中,我习惯从数据库层面开始,一方面是因为我本身是做DBA的,对数据库比较了解;另一部分也是因为相比于模板和视图来说,模型从设计之初基本已确定,不会有大的改动。
我们的模型models.py定义如下:
其中最核心的表是最后一张Task,在业务逻辑上代表开发人员提交给DBA的一个数据库更改请求,其它所有表都是围绕这个表创建的:Manager表是Task.manager的外键,Dba表是Task.dba的外键,State表是Task.state的外键,其中比较特殊的是Task.databases和Database表是多对多的关系。还有一点要注意的是,Task.creater是Django自带的用户表auth_user的外键。
以上models.py定义了ORM关系,但当前这些表只存在models.py中,在数据库中还不存在,我们需要通过以下步骤同步数据库:
首先,通过以下语句验证models.py定义模型的正确性:
如果上面没有错误,就可以执行如下语句同步数据库了(在同步之前,一定要先确认settings.py中DATABASES属性已正确配置,具体看第3篇):
如果你想知道syncdb究竟在数据库里做了什么,可以执行如下语句获得DDL:
至此,模型已经创建成功,之后我们就可以在Django中自由的操纵数据库了。
在Web开发中,我习惯从数据库层面开始,一方面是因为我本身是做DBA的,对数据库比较了解;另一部分也是因为相比于模板和视图来说,模型从设计之初基本已确定,不会有大的改动。
我们的模型models.py定义如下:
from django.db import models from django.contrib.auth.models import User class Manager(models.Model): id = models.AutoField(primary_key=True) username = models.CharField(max_length=30) first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) email = models.EmailField(max_length=70) def __unicode__(self): return self.last_name + self.first_name class Dba(models.Model): id = models.AutoField(primary_key=True) username = models.CharField(max_length=30) first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) email = models.EmailField(max_length=70) def __unicode__(self): return self.last_name + self.first_name class State(models.Model): id = models.AutoField(primary_key=True) statename = models.CharField(max_length=20) def __unicode__(self): return self.statename class Database(models.Model): id = models.AutoField(primary_key=True) databasename = models.CharField(max_length=30) databaseip = models.CharField(max_length=30) def __unicode__(self): return self.databasename + ' - ' + self.databaseip class Task(models.Model): id = models.AutoField(primary_key=True) creater = models.ForeignKey(User) manager = models.ForeignKey(Manager) dba = models.ForeignKey(Dba) state = models.ForeignKey(State) databases = models.ManyToManyField(Database) sql = models.CharField(max_length=2000,blank=True,null=True) desc = models.CharField(max_length=2000,blank=True, null=True) createdtime = models.DateTimeField() lastupdatedtime = models.DateTimeField(blank=True,null=True) dbacomment = models.CharField(max_length=2000,blank=True,null=True) attachment = models.FileField(upload_to='tasks',blank=True,null=True) def __unicode__(self): return str(self.id)
其中最核心的表是最后一张Task,在业务逻辑上代表开发人员提交给DBA的一个数据库更改请求,其它所有表都是围绕这个表创建的:Manager表是Task.manager的外键,Dba表是Task.dba的外键,State表是Task.state的外键,其中比较特殊的是Task.databases和Database表是多对多的关系。还有一点要注意的是,Task.creater是Django自带的用户表auth_user的外键。
以上models.py定义了ORM关系,但当前这些表只存在models.py中,在数据库中还不存在,我们需要通过以下步骤同步数据库:
首先,通过以下语句验证models.py定义模型的正确性:
python manage.py validate
如果上面没有错误,就可以执行如下语句同步数据库了(在同步之前,一定要先确认settings.py中DATABASES属性已正确配置,具体看第3篇):
python manage.py syncdb
如果你想知道syncdb究竟在数据库里做了什么,可以执行如下语句获得DDL:
python manage.py sqlall app_name
至此,模型已经创建成功,之后我们就可以在Django中自由的操纵数据库了。
相关文章推荐
- [Django实战] 第9篇 - 表单、视图、模型、模板的交互
- Django实战(2):创建第一个模型类
- Django框架之模型(models)ORM对象关系映射描述
- Python开发入门与实战5-django模型
- Django在OS X下的编程实战(二)操作博客数据模型
- django学习6 orm模型
- 【django】利用fbv模型与orm进行页面登录操作
- django ORM数据模型的定义
- Django的ORM数据模型的反向关系
- [Django实战] 第9篇 - 表单、视图、模型、模板的交互
- django模型ORM笔记
- web框架开发-Django模型层(1)之ORM简介和单表操作
- Django模型系统——ORM中跨表、聚合、分组、F、Q
- Django模型和ORM
- Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]
- Django ORM模型:想说爱你不容易
- python django -2 ORM模型
- Django模型系统——ORM表结构对应关系
- Django模型系统——ORM校园管理系统代码
- Django 模型系统(model)&ORM--进阶