Django基础(三)

今天是在前面models.py建立基础数据模型的基础上,补充一些Model相关的知识。

Posted by K4ys0n on December 19, 2019

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堂课》