Model简介
Model是Django表示数据的模式,我们可以在models.py中设置数据项、数据格式等,一个数据类对应数据库的一个数据表。 数据表之间的关联也要在数据类中定义好。完成定义,Django不需要我们编写SQL指令,在一些程序的控制下它就会自动生成 SQL语句并执行了。事实上我们只要配置好数据库即可,什么数据库不重要。
models.py创建类
from django.db import models
from django.utils import timezone
class Post(models.Model):
title = models.CharField('标题', max_length=200, unique=True)
slug = models.SlugField('slug', max_length=60, blank=True)
body = models.TextField('正文')
published_time = models.DateTimeField('发表时间', default=timezone.now, null=True)
导入models类库和timezone时区时间库,定义模型类Post,它是继承自models.Model通用模型类的。 接下来在类中定义字段fields:
- title:博客的标题用models.CharField字段,命名‘标题’,最大字符数200,unique表示独特的,不能重复。
- slug:博客的简短标志用models.SlugField字段,命名‘slug’,最大字符数60,blank表示可以为空白。
- body:博客的正文用models.TextField字段,命名‘正文’。
- published_time:博客的发表时间用models.DateTimeField字段,命名‘发表时间’,默认值为当前时间,null表示允许值为空。
models常用数据字段格式说明
字段格式|参数|说明
— | — | —
BooleanField||布尔值,True/False
CharField|max_length:最大字符串长度|存储较短数据的字符串,通常使用单行的文字数据
DateField|auto_now:每次对象被存储时就自动加入当前日期
auto_now_add:只有在对象被创建时才加入当前日期|日期格式,可用于datetime.date
DateTimeField|同上|日期时间格式,对应到datetime.datetime
DecimalField|max_digits:最大位数
decimal_places:小数占所有位数中的几个位|定点小数数值数据,适用于Python的Decimal模块的实例
FloatField||浮点数字段
IntegerField||整数字段,最常用的整数格式
PostiveIntegerField||正整数字段
BigIntegerField||64位的大整数
EmailField|max_length:最大字符串长度|可接受电子邮件地址格式的字段
SlugField|max_length:最大字符串长度|同CharField,简短标志字段,通常用于url的一部分
TextField||长文字格式,一般用在HTML窗体的Textarea输入
URLField|max_length:最大字符串长度|同CharField,一般用来记录完整的url网址
更多field字段可以查看源码,在django安装目录下找到这个文件:venv/Lib/site-packages/django/db/models/fields/__init__.py。
我的是在虚拟环境venv下。
models各个字段常见的通用属性
字段选项|说明 —|— null|是否接受存储空值NULL,默认是不接受(False) blank|是否接受存储空白内容,默认是不接受(False) choices|以选项的方式(必须是固定内容格式的数据才能用)作为此字段的候选值,一般是一个元组,元组里包含各个候选值元组 default|设置此字段的默认值 help_text|帮助信息 primary_key|设置本字段为数据库主键,默认为不设置(False) unique|设置本字段是否为唯一值,默认为不设置(False) verbose_name|给字段起个别名 这几个字段都听常用的,unique可以考虑对象的唯一性,比如文章标题不能重复;null考虑是否可以为空值,blank考虑是否可以留空白等,null用于数值或日期,blank用于字符串。
choices举个例子好了:
class Post(models.Model): # 博客表类
choices = (
('draft', '草稿'),
('published', '发表'),
)
title = models.CharField('标题', max_length=200, unique=True)
slug = models.SlugField('slug', max_length=60, blank=True)
body = models.TextField('正文')
published_time = models.DateTimeField('发表时间', default=timezone.now, null=True)
status = models.CharField('文章状态', max_length=1, choices=choices, default='published')
Meta内置类常用参数
class Post(models.Model): # 博客表类
title = models.CharField('标题', max_length=200, unique=True)
slug = models.SlugField('slug', max_length=60, blank=True)
body = models.TextField('正文')
published_time = models.DateTimeField('发表时间', default=timezone.now, null=True)
class Meta:
ordering = ['-published_time']
verbose_name = '博客'
verbose_name_plural = verbose_name
一般用到这三个字段:
- ordering是一个列表或者元组,表示该类要按照哪个字段排序,默认从小到大排,字段前加负号表示从大到小排序。
- verbose_name是说在网站管理界面admin显示的时候,这个类的名称单数是什么。
- verbose_name_plural是verbose_name的复数,默认在verbose_name后加s或者es。
常见内置方法
class Post(models.Model): # 博客表类
title = models.CharField('标题', max_length=200, unique=True)
slug = models.SlugField('slug', max_length=60, blank=True)
body = models.TextField('正文')
published_time = models.DateTimeField('发表时间', default=timezone.now, null=True)
def get_absolute_url(self):
return reverse('blog:post_detail', args=[str(self.id), self.slug])
def __str__(self):
return self.title
这里用到两种方法:
- get_absolute_url(),这个方法用于,当创建该类的对象后,自动跳转到相应的编辑页面, 返回值是一个url,这里由于使用app名称加路由名称的格式代替url,所以需要用reverse逆向 解析成url,传入的两个参数是根据url需要的。
- __str__(),这个方法是用于该类对象需要被转化成字符串或者输出字符串时, 比如print(一个post对象),那么这时就会输出这个方法的返回值,是一个str类型。
生成指令并执行
确保settings.py中INSTALLED_APP设置了APP的名称,然后在命令行输入:
python manage.py makemigrations
python manage.py migrate
接着运行网站:
python manage.py runserver
浏览器输入127.0.0.1:8000/admin进入后台,输入账号密码(如果没有则运行网站后用python manage.py createsuperuser创建)。
就可以看到创建的各种数据表了,可以直接添加、删除或修改了。
后记
这一章暂时补充到这里,后面继续博客网站的视图和路由的设计以及bootstrap的学习。
参考:
《Python新手学Django 2.0架站的16堂课》