请稍候,加载中....

No.6 创建模型

现在数据库已经初始化完成了,接下来就可以为自己的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)>

现在有了数据,我们就可以开发视图来显示这些数据了

 


Python学习手册-