目录
1 概述
2 示例
3 字段说明
3.1 字段类型
3.2 字段选项
4 模型属性
5 模型方法
6 模型继承
6.1 抽象基类
6.2 非抽象继承(多表继承)
6.3 代理继承
6.4 多重继承
7 结语
本文档着眼于快速入门,参考自官方文档(https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/),通过提取官方文档中在项目中常用的部分进行学习总结。
from django.db import models
class Film(models.Model):
id=models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
img = models.CharField(max_length=200)
video = models.CharField(max_length=200)
suppose_num = models.IntegerField(default=0)
download_num = models.IntegerField(default=0)
main_page = models.CharField(max_length=200)
add_time = models.DateTimeField
add_user = models.IntegerField
update_time = models.DateTimeField
update_user = models.IntegerField
通过上面我们针对模板有几点说明,如下:
(1)基本上每一个模板都对应一个数据库表。
(2)模板必须继承自models.Model。
(3)每个属性相当于一个字段。
(4)如果我们不设置主键,django将自动设置主键。
在创建模型后,如果我们想要通过模型来生成数据库对应的表,需要执行以下两个命令:
python manage.py makemigrations
python manage.py migrate
定义字段的时候小心与模型的api冲突。
字段类型可以用以指定数据库的字段类型和字段的属性设置。同时也可以进行数据验证。
常见的字段类型如下:
字段类型 | 说明 | 备注 |
AutoField |
自增字段 | 通常模型如果不设置主键,将会有这个来字段类型的主键。 |
BooleanField |
布尔值 | |
CharField |
字符串 | |
DateField |
日期 | |
DecimalField | ||
EmailField |
邮件 | |
FloatField |
浮点数 | |
IntegerField |
整数 |
更多字段类型参考https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/#model-field-types。
字段选项其实就是对字段的一些要求,这里我们仅仅列举一些通用的。
选项名称 | 说明。 |
null | 如果为True,当该字段为空时,django会自动将其在数据库设置成null。 |
blank | 和null类似,不同的是blank也可用于表单验证。 |
default | 默认值。 |
primary_key | 如果设置成True,则该字段为主键。 |
unique | 该字段必须在表中唯一 |
详细请参考https://docs.djangoproject.com/zh-hans/3.0/topics/db/models/。
在这里我们就不对关联关系进行总结了,因为针对关联关系推荐我们由程序来控制。
模型当中最重要的属性Manager,是django模型和数据库查询之间的接口,默认名称为objects。
模型方法应该是在某个对象上生效的。而模型属性对应的方法是应用于表的。
我们常见的数据库字段,添加时间,添加人,修改时间,修改人等都是几乎所有模型(数据库表)需要用到的,这里我们就可以直接使用抽象基类来完成这件事,首先我们还是直接看例子。
class BasicModel(models.Model):
add_time = models.DateTimeField(auto_now_add=True)
add_user = models.IntegerField
update_time = models.DateTimeField(auto_now=True)
update_user = models.IntegerField
class Meta:
abstract = True
class Film(BasicModel):
id=models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
img = models.CharField(max_length=200)
video = models.CharField(max_length=200)
suppose_num = models.IntegerField(default=0)
download_num = models.IntegerField(default=0)
main_page = models.CharField(max_length=200)
def __str__(self):
return self.name
这里由于BasicModel是一个抽象类,所以不会生成表,但是子类会使用到对应的字段在表中。
当我们想要将一个模型和继承另一个模型的时候,并且这两个模型会同时创建两个表,而里面的字段不重复,这个时候我们就可以使用多表继承。
在我们针对用户和用户详细信息的就可以用到这个。因为我们并不希望用户详细信息表里面由用户信息,但是我们又希望用户详细信息模板包含用户信息的内容
示例如下:
from django.db import models
class BasicModel(models.Model):
add_time = models.DateTimeField(auto_now_add=True, null=True)
add_user = models.IntegerField(null=True)
update_time = models.DateTimeField(auto_now=True)
update_user = models.IntegerField(null=True)
is_deleted = models.IntegerField(choices=('0', '1'), null=True)
class Meta:
abstract = True
class User(BasicModel):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
password = models.CharField(max_length=100)
email = models.EmailField
phone = models.CharField(max_length=50)
is_admin = models.IntegerField(choices=('0', '1'))
@property
def username(self):
return '%s %s'.format(self.first_name, self.last_name)
class UserDetail(User):
user_id = models.IntegerField(null=False)
address = models.CharField(max_length=200)
hobby = models.CharField(max_length=200)
上面的多表继承,每个子模型都会创建一张新表,有些时候我们并不希望创建一张信标,仅仅希望来改表父模型的行为,这个时候我们就可以用到代理继承。
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class MyPerson(Person):
class Meta:
proxy = True
def do_something(self):
# ...
pass
上面可以看出,就只添加了一个do_something方法,代理模型其实有点类似与设计模式中的代理模式。
代理继承的基类约束如下:
(1)一个代理模型必须继承一个非抽象基类。
(2)代理模型可以继承多个没有字段的抽象基类。
(3)代理模型可以继承多个继承自同一非抽象基类的代理模型。
暂时不推荐使用,因为继承结构过于混乱,不利于清晰的逻辑。
上面就是目前关于django模型的学习记录,后期会针对常用部分继续完善,谢谢。