Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第五章: django模型 > 5.4节: 模型的字段类型

5.4节: 模型的字段类型

薯条老师 2020-07-29 16:59:43 383829 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

5.4.1 模型中的字段类型

在5.3节的Blog模型定义中,使用了xxxField的类型对模型的类属性进行了定义。xxxField表示模型中的字段类型,与数据表中的字段类型一一对应,例如CharField对应于数据库中的字符串类型,IntegerField对应于数据库中的整型类型。django模型中内置的字段类型,都是从Field类型中进行派生的:

class CharField(Field):
    pass

如需自定义字段类型,需从Field类型或其子类中进行继承。django模型中的字段类型,会自动对数据的合法性进行校验。django模型常用的字段类型:

类型名

 

描述

IntegerField

整型类型,用于保存一个整数

AutoField

其实质是一个整型类型,用来定义数据库中的自增字段。构造该对象时必须设置primary_key参数的值为True,表示设置为主键。

BooleanField

布尔类型

FloatField

浮点类型,用于保存一个浮点数

DecimalField

用来保存固定精度的十进制浮点数。构造该对象时必须指定max_digits与decimal_places参数的值。

max_digits表示浮点数的最大位数,decimal_places表示小数点后的最大位数。

CharField

字符串类型,用于保存短文本。构造该对象时必须指定max_length参数的值,表示文本的最大长度。

TextField

字符串类型,用于保存长文本。

DateField

日期类型,格式为:YYYY-MM-DD,即年-月-日的日期格式。构造DateField对象的三个重要参数:

(1)auto_now

该参数默认为False, 设置为True时,Django会每次将该字段更新为当前时间,且字段值不能手动进行修改。

 

(2)auto_now_add

该参数默认为False, 设置为True时,Django会将字段的值设置为创建时的时间,与auto_now参数只能设置其一,同样不能再对字段值进行手动修改。

(1) default

通过default参数来设置字段的默认值,设置default的值以后,可以对字段值进行手动修改。

 

DateTimeField

DateField的子类,表示日期时间类型。

格式为:YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],格式中的ss表示秒数,u表示毫秒数,TZ表示时区,都是可选的。

 

TimeField

时间类型,格式为:HH:MM[:ss[.uuuuuu]][TZ]

URLField

字符串类型,用于保存URL,Django会检查URL格式的合法性

EmailField

字符串类型,用于保存邮件地址,Django会检查email格式的合法性

IPAddressField

字符串类型,用于保存IP地址,Django会检查IP地址格式的合法性

FileField

文件上传字段,用来定义文件上传的属性。

构造该对象时必须指定upload_to参数的值,表示上传文件的存储路径。

通过FileField的url属性可以获取文件的url。

ImageField

图片文件上传字段,FileField的子类,用来定义图片文件上传的属性。

同FileField,通过url属性可以获取图片的url。

5.4.2 字段类型的可选参数

在构造模型的字段类型时,可以传递一些可选的参数,以对模型字段进行修饰和约束。字段类型常用的可选参数:

可选参数名

 

描述

null

布尔类型,默认为False, 表示字段的值不能为空。如果设置为True,表示字段的值可以为空,字段值为空时,Django会在对应的数据库字段中设置为NULL值。

blank

布尔类型,默认为False, 表示字段的值不能为空。如果设置为True, 表示字段的值可以为空,字段值为空时,Django会在对应的数据库字段中设置为空字符串。

default

用来设置字段的默认值

unique

布尔类型,如果设置为True, 该字段在数据表中必须是唯一的。

primary_key

布尔类型,用来指定主键,定义模型时如未指定主键,Django会自动添加一个AutoField类型来作为主键。

choices

用来对字段的值进行枚举,choices参数的值为一个序列类型,序列中的元素为元组类型,格式为:

[(value, display_name), (value, display_name) ...])

value表示字段存储在数据库中的值,diplay_name表示显示的名称。

通过模型的get_xxx_display方法可以获取字段的显示名称,xxx表示具体的模型字段名。

 

db_column

用来定义模型字段在数据库中的字段名称,默认与模型的类属性名相同

db_index

布尔类型,设置为True时会在对应的数据库字段中创建索引

help_text

字符串类型,用来定义模型字段的帮助信息

verbose_name

字符串类型,用来为模型字段定义一个可读的显示名称,verbose_name会在后台管理系统中作为标签进行显示。

 5.4.3 模型字段使用实例

现在继续对博客后台进行改进,使其支持图片文件上传,自定义博客的内容分类,以及自动更新博客的最后修改时间。现在请读者按照以下步骤进行操作:

(1) 打开blog目录下的models.py, 对blog模型进行修改

模型blog更新后的代码:

class Blog(models.Model):
    # 对模型字段使用verbose_name取一个可读的名称
    author = models.CharField(max_length=20, verbose_name="作者")
    title = models.CharField(max_length=50, verbose_name = "标题")
    content = models.TextField(verbose_name="内容")
 
    # 新增的模型字段
    """
    添加一个发布时间字段pub_time, 将参数auto_now_add设置为True,
    Django会将字段的值设置为数据首次插入时的时间
    """
    
    pub_time = models.DateTimeField(auto_now_add=True, verbose_name="发布时间")
    """
    添加一个修改时间字段modify_time,将参数auto_now设置为True,
    Django会将字段的值设置为每次修改时的时间
    """
 
    modify_time = models.DateTimeField(auto_now=True, verbose_name="修改时间")
 
    """
    添加一个分类字段category, 0对应的是python,1对应的是C,2对应的是C++, 
    然后使用模型中的choices参数对字段值进行枚举,使用choices参数时,
    需通过default参数指定一个默认值。
    """
 
    categories = [(0, "python"),
                  (1, "C"),
                  (2, "C++"),
                  ]
 
    category = models.IntegerField(choices = categories, default=0, verbose_name="内容分类")
 
    """
    添加一个图片上传字段illustration,使用upload_to参数定义图片上传的路径,
    在模型中使用图片上传需要在settings.py中进行配置
    """
    illustration = models.ImageField(upload_to='images', null=True,verbose_name="插图")

(2) 修改settings.py

一共需要修改两个地方,在第(1)步中使用了日期时间字段,django配置的默认时区为UTC,UTC与北京时间相差8个时区。打开settings.py,将全局变量TIME_ZONE的值修改为:'Asia/Shanghai'

TIME_ZONE = 'Asia/Shanghai'

注意:上海与北京没有时差,所以时间能正常显示。在settings.py中配置文件的上传目录,与文件上传相关的全局变量: MEDIA_ROOT。MEDIA_ROOT表示文件上传的根目录(相对于服务器根目录的路径)。settings.py更新后的代码:

MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')

表示将服务器根目录下的upload目录作为文件的上传目录。在模型中定义的ImageField字段:

illustration = models.ImageField(upload_to='images', null=True)

upload_to参数指定的是相对于MEDIA_ROOT的存储目录,该目录如未存在,django会自动进行创建。如需指定文件的访问URL,需要对全局变量MEDIA_URL进行修改。

MEDIA_URL = '/media/'

上文中的代码表示将/media/配置为图片URL的访问前缀。假设文件所在的上传目录为:

upload/images/test.png

则其url为:

http://ip:port/media/images/test.png

ip表示服务器的IP地址,port表示服务器的端口号。

(3) 安装Pillow模块

在模型中使用ImageField需要预先安装Pillow模块,安装的命令为:

pip install pillow

(2) 配置文件访问的路由

图片文件上传以后,如需通过url进行访问,还需配置文件的访问路由。打开urls.py, 脚本更新后的代码:

from django.contrib import admin
from django.urls import path,re_path
 
import blog.views as blog
 
# 新增的代码,分别导出settings模块,static模块
from django.conf import settings
from django.conf.urls.static import static
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', blog.Home.as_view()),
 
    path('arithmetic/', chipscoco.arithmetic),
    path('html/', blog.Html.as_view()),
    re_path('blog/(\d+).html', blog.blog),
 
]
# 将文件的上传目录添加至路由中
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

(5) 修改视图及模板中的代码

打开chipscoco目录下的views.py,修改blog视图。blog视图更新后的代码:

# 从模型中导出Blog模型
from .models import Blog
 
def blog(request, page_id):
    if request.method == "GET":
        # 调用模型的get方法获取对应主键的数据,数据不存在时会抛出异常
        try: 
            blog = Blog.objects.get(id=page_id)
            
            # 通过模型的get_xxx_display方法获取字段值的显示名称
            # xxx表示对应的字段名
            blog.category = blog.get_category_display()
        except:
            blog = {}
            # 将blog传递给模板blog.html,进行数据渲染
        return render(request, "blog.html",{"blog": blog})

模板blog.html更新后的代码:

{% load static %}
<html>
<head>
<title>Django的美妙爵士乐</title>
</head>
<body>
 
<h1>{{blog.title}}</h1>
<div>
<span><strong>作者:</strong>{{blog.author}}</span> <span><strong>分类:</strong>{{blog.category}}</span>
</div>
<p>{{blog.content}}</p>
<p><strong>博客修改时间:</strong>{{blog.modify_time}}</p>
<img src="{{blog.illustration.url}}">
</body>
</html>

(6) 将模型中的变更更新到数据库

进入windows命令行,切换到D盘的django-project目录,在命令行中执行python manage.py makemigrations命令生成迁移脚本文件。执行makemigrations命令时输出了以下提示信息:

D:\django-project>python manage.py makemigrations

You are trying to add the field 'pub_time' with 'auto_now_add=True' to blog without a default; the database needs something to populate existing rows.

 

 1) Provide a one-off default now (will be set on all existing rows)

 2) Quit, and let me add a default in models.py

Select an option: 1

直接选择1选项,然后按照提示输入默认值timezone.now

Please enter the default value now, as valid Python

You can accept the default 'timezone.now' by pressing 'Enter' or you can provide another value.

The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now

Type 'exit' to exit this prompt

[default: timezone.now] >>> timezone.now

继续在命令行中执行 python manage.py migrate命令,以将模型中的变更应用到数据库中。

(7) 在后台管理系统中上传图片

在浏览器中输入http://127.0.0.1:8080/admin/,进入后台管理系统:

image.png

点击页面上的Blogs链接:

 image.png

点击页面上的Blog object(1)链接,对数据进行修改:

 image.png

 

页面左侧的作者,标题,内容等标签,即为在模型中通过verbose_name参数定义的值。内容分类标签所对应的下拉框选项,即为通过choices参数定义的枚举值。

将DateTimeField的auto_now或auto_now_add参数设置为True后,django将禁止手动对字段值进行修改,故pub_time与modify_time不会显示在页面中。

点击页面中的浏览按钮可以上传图片,对内容进行修改以后,点击保存按钮以将数据更新到数据库中。

(8) 在浏览器中进行测试

在浏览器中输入http://127.0.0.1:8080/blog/1.html:

image.png

5.4.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论: