Django模型model

来源:互联网 发布:小米手机解锁软件 编辑:程序博客网 时间:2024/05/01 21:59
模型Model


django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,
通过模型类和对象完成数据表的crud。


ORM--全拼Object-Relation Mapping,中文意为对象-关系映射。
ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。


在MVC框架中的Model模块中都包括ORM,对于开发人员主要带来了如下好处:
1.实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,
  而不需要修改代码
2.只需要面向对象编程,不需要面向数据库编写代码


使用django进行数据库开发的步骤如下:
1.在models.py中定义模型类
2.迁移
生成迁移
python manage.py makemigrations
执行迁移
python manage.py migrate
3.通过类和对象完成数据crud


创建项目


创建项目test1,创建应用booktest
使用MySQL数据库,这是Web项目首选的数据库

在Terminal中安装mysql包
pip install pymysql

在命令行登录mysql,创建数据库test2
create database test2 charset=utf8;


打开test2/settings.py文件,找到DATABASES项,修改为使用MySQL数据库
将引擎改为mysql,提供连接的主机HOST、端口PORT、数据库名Name、
用户名USER、密码PASSWORD


在test2/init.py文件中引入pymysql包
import pymysql
pymysql.install_as_MySQLdb()

1.定义模型
模型类被定义在“应用/models.py”文件中,继承自models.Model类

定义属性

属性命名限制
不能是python的保留关键字
不允许使用连续的下划线

定义属性时需要指定字段类型,通过字段类型的参数指定选项
语法如下:
属性=models.字段类型(选项)

字段类型:

使用时需要引入django.db.models包,字段类型如下
AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField:布尔字段,值为True或False
NullBooleanField:支持Null、True、False三种值
CharField(max_length=字符长度):字符串
参数max_length表示最大字符个数
TextField:大文本字段,一般超过4000个字符时使用
IntegerField:整数
DecimalField(max_digits=None, decimal_places=None):十进制浮点数
参数max_digits表示总位数
参数decimal_places表示小数位数
FloatField:浮点数
DateField[auto_now=False, auto_now_add=False]):日期
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
TimeField:时间,参数同DateField
DateTimeField:日期时间,参数同DateField
FileField:上传文件字段
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片

关系字段类型

关系型数据库的关系包括三种类型:
ForeignKey:一对多,将字段定义在多的一端中
ManyToManyField:多对多,将字段定义在两端中
OneToOneField:一对一,将字段定义在任意一端中
可以维护递归的关联关系,使用'self'指定,详见“关联对象”


选项


通过选项实现对字段的约束,选项如下:
null:如果为True,表示允许为空,默认值是False
blank:如果为True,则该字段允许为空白,默认值是False
对比:null是数据库范畴的概念,blank是表单验证证范畴的
db_column:字段的名称,如果未指定,则使用属性的名称
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False
default:默认值
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False
元选项


数据表的默认名称为
<app_name>_<model_name>
例:booktest_bookinfo
在模型类中定义类Meta,用于设置元信息,如使用db_table自定义表的名字


示例(参考课件)


2.模型成员


模型实例方法


str:在将对象转换成字符串时会被调用
save():将模型对象保存到数据表中
delete():将模型对象从数据表中删除

模型类的属性

属性objects:管理器,是Manager类型的对象,用于与数据库进行交互


为模型类BookInfo定义管理器books语法如下
class BookInfo(models.Model):
...
books = models.Manager()


管理器Manager

管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器


自定义管理器类主要用于两种情况
1.修改原始查询集,重写get_queryset()方法
#图书管理器
class BookInfoManager(models.Manager):
def get_queryset(self):
#默认查询未删除的图书信息
#调用父类的成员语法为:super(子类型, self).成员
return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
2.向管理器类中添加额外的方法,如创建对象
class BookInfoManager(models.Manager):
...
#创建模型类,接收参数为属性赋值
def create(self, title, pub_date):
#创建模型类对象self.model可以获得模型类
book = self.model()
book.btitle = title
book.bpub_date = pub_date
book.bread=0
book.bcommet=0
book.isDelete = False
return book