现在数据库已经初始化完成了,接下来就可以为自己的app设计模型也就是数据表结构了
模型设计
每个应用对模型的设计目标是不一样的,以polls投票应用举例,首先需要有一张表来记录投票的问题,然后再创建另外一张表用来记录投票选项
问题表结构
问题ID | 问题描述 | 发布时间 |
1 | 你知道猿变实验室吗? | 2016-12-12 12:00:00 |
2 | 你是纯小白同学吗? | 2017-12-12 12:00:00 |
投票选项表结构
选项ID | 关联问题ID | 选项描述 | 投票数 |
1 | 1 | 知道 | |
2 | 1 | 不知道 | |
3 | 2 | 是 | |
4 | 2 | 不是 |
创建模型
在app应用程序中创建models.py, 在这里就是polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
在Django中,自定义模型需要从django.db.models.Model继承
在django.db.models定义了各种数据库的字段类型
常用字段类型
字段类型 | Field类 | 实例化参数 |
自增类型(自增ID) | AutoField | |
二进制类型 | BinaryField | max_length |
布尔类型 | BooleanField | default |
字符串类型 | CharField | max_length, default |
日期类型 | DateField | auto_now |
日期时间类型 | DateTimeField | auto_now |
时间类型 | TimeField | auto_now |
固定精度类型 | DecimalField | max_digits, decimal_palces |
Email类型 | EmailField | max_length(实际类型为Char) |
文件上传类型 | FileField | upload_to=path, storage |
文件路径类型 | FilePathField | path=abs_path |
浮点数类型 | FloatField | |
整数类型 | IntegerField | |
json类型 | JSONField | encoder, decoder |
小型整数类型 | SmallIntegerField | 取值范围在-32768 ~ 32767之间 |
文本类型 | TextField | |
URL类型 | URLField | max_length |
UUID类型 | UUIDField | default=uuid.uuid4 |
激活模型
创建模型之后,需要根据模型来创建数据表
激活模型之间必须确认在myproject/settings.py中已经添加了应用程序以及数据库配置
参照数据库配置进行检查
执行激活模型命令
python manage.py makemigrations polls
如果一切正常输入如下结果
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
模型创建SQL语句查看
创建应用程序的模型后,会在应用程序目录下出现migrations目录,该目录存储了每次模型变化的SQL语句
python manage.py sqlmigrate polls 0001
执行SQL语句
现在只是生成了创建模型数据表的SQL语句,但是并没有真正的执行这些SQL语句,因此还需要执行这些SQL语句,才能真正创建模型所需要的数据表
python manage.py migrate
访问模型数据
现在就可以通过Django提供的API数据访问接口来访问模型数据
使用shell环境访问数据API
python manage.py shell
进入shell环境后,就可以参照下列步骤来访问数据模型
No.1 导入相关的对象模型
>>> from polls.models import Choice, Question
No.2 尝试检索Question包含的记录
# 查询Question的所有数据
>>> Question.objects.all()
<QuerySet []>
No3. 向数据库插入一条Question数据
>>> from django.utils import timezone
# 插入一条数据
# 创建一条数据的Question实例
>>> q = Question(question_text="你知道猿变实验室吗?", pub_date=timezone.now())
# 使用save方法完成数据的插入
>>> q.save()
No.4 查看对象属性
# 通过属性id,可以获得插入数据的id
>>> q.id
1
# 数据的每个字段都是实例的属性
>>> q.question_text
"你知道猿变实验室吗?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
No.5 更改对象
# 通过更改属性值,可以达到修改字段值的目的
>>> q.question_text = "你知道猿变吗?"
>>> q.save()
No.6 再进行一次数据检索
# 再执行一次,就会有数据了,成功
>>> Question.objects.all()
No.7 添加关联模型数据
Choice与Question是关联模型,也就是数据表中多对一的关系,可以通过q
对象的q.choice_set.create()
方法添加
>>> q.choice_set.create(choice_text="是的")
No.8 查看关联数据
>>> q.choice_set.all()
<QuerySet [<Choice: Choice object (1)>, <Choice: Choice object (2)>]>
No.9 也可以通过choice对象来查看Question
>>> choice_obj = Choice.objects.first()
>>> choice_obj.question
<Question: Question object (3)>
现在有了数据,我们就可以开发视图来显示这些数据了
讨论区