Django入门:第四章、模型设计

简介: Django入门:第四章、模型设计

第四章目录

 模型设计

回顾

前三章我们可以算是一脚迈进了Django的大门(也称入坑),因为程序员入坑第一步就是学会Hello World。希望你别骄傲,我们接下来才是真正的旅途——一起领略Django真正的迷人之处。

模型本质

现在,我们来学习模型,Django模型层是Django框架自定义的一套独特的ORM(Object Relational Mapping,关系映射模型)技术。

模型本质上就是数据库表的布局,再附加一些元数据。模型包含了你要在数据库中创建的字段信息及对数据表的一些操作。

基本操作

想要操作模型,我们先来了解Django模型层的大概。使用Django模型开发的首要任务就是定义模型类及其属性,每个模型的物理存在方式就是一个Python的类Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,而类中的每个属性被映射为数据表中的一列字段。

可能你还是很懵逼,没关系,我们从伪代码中再来看看这些概念。

  1. 模型类定义
    模型定义的基本结构如下:
from django.db import models
class ModelName(models.Model):
  field1 = models.XXField(...)
  fiels2 = models.XXField(...)
  ...
  class Meta:
    db_table = ...
    other metas = ...

解析如下:

  • 所有Django模型都是django.db.models.Model类的子类。每个类都会被转换为数据库表
  • 通过其中的类属性定义模型字段,模型字段必须是某种models.XXField类型,比如CharField,DateTimeField等等,而这些就会被转换为对应数据库表中的列
  • 通过模型类中的Meta子类定义模型元数据,比如数据库表名、数据默认排序方式等。

我们来详细看一个样例:

定义了一个 Person, 其拥有 first_name 和 last_name:

from django.db import models
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

first_name 和 last_name 是模型的字段。每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。

上面的 Person 模型会创建一个如下的数据库表:

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

我们介绍一下class Meta中的那些属性,Meta类的属性名由Django预定义,我们无需自己创建,Model 元数据就是 “不是一个字段的任何数据” – 比如排序选项,常见的Meta类属性汇总如下:

  • abstract: True or False,标识本类是否为抽象基类
  • app_label: 定义本类所属的应用,比如app_labels = ‘myapp’
  • db_table:映射的数据表名,比如db_table=‘db_blogs’
  • default_related_name:定义本模型的反向关系引用名称,默认与模型名一致。
  • ordering:本模型记录的默认排序字段,可以设置多个字段,默认以升序排列,如果降序需要在字段前加“负号”。比如,按文章发布时间降序显示:
class Meta:
        ordering = ("-publish_date", )   # 按照publish字段值的倒序显示
  • …还有很多其他的选项,我们暂时先不列出,有兴趣的可以自行查看Django文档 Model Meta options,先混个眼熟,等项目中具体用到我们再添加。

上诉只是简单列出一些能用到的 Meta 选项。我们需要注意的使:没有一个选项是必需的,是否添加 class Meta 到你的 model 完全是可选的。

  1. 普通字段类型

普通字段类型是指模型类中除外键关系外的数据字段类型。数据字段为Django使用模型时提供如下信息。

  • 在数据库中用什么类型定义模型字段,比如INTEGER、VARCHAR等。
  • 用什么样的HTML标签显示模型字段,比如<input type="radio">等。
  • 需要什么样的HTML表单数据验证。

所有的数据字段的属性必须继承自抽象类django.db.models.Field,我们可以使用Django预定义的一系列Field子类,也可以自己定义继承该类的字段类型。

  • AutoField:一个自动递增的整型字段,添加记录时它会自动增长。AutoField字段通常用于数据表的主键;如果模型中没有指定主键字段,则Django会自动添加一个AutoField字段。
  • BigIntegerField:64位整型字段
  • CharField:字符串字段,用于较短的字符串,相对应的HTML标签是单行输入框<input type="text">
  • TextField:大容量文本字段,相对应的HTML标签是多行编辑框<textarea>
  • 更多字段类型,参见官方 Model field reference
  1. 常用的字段参数
    每个字段类型都有一些特定的HTML标签和表单验证参数,比如height_field、path等。
  • primary_key参数:设置一个模型的主键字段,为True或False
from django.db import models
class Person(models.Model):
    id = models.AutoField(primary_key=True)
  • null:定义是否允许相对应的数据库字段为Null,默认设置为False
  • blank:如果为True,则该字段允许为空白。默认值为False

请注意,这个字段与null有所不同。null与数据库完全相关,是数据库的飞空约束;而blank与表单验证相关。如果字段包含blank=True,则表单验证将允许输入一个空值。

  • choices:定义字段的可选值,本字段的值应该是一个包含二维元素的元组,第一个元素是实际存储的值,第二个元素是HTML页面中显示给我们看的名称,我们之后的项目会用到这一字段。例如:
from django.db import models
LEVLES = (
    ('1', 'Very Good'),
    ('2', 'Good'),
    ('3', 'Normal'),
    ('4', 'Bad'),
)
class Comment(models.Model):
  id = models.AutoField(primary_key=True)
  levels = models.CharField(max_length=1, choices=LEVELS)
  • help_text:HTML页面中输入控件的帮助字符串
  • unique:如果为True,代码此字段在整个表中是唯一的。

总结

到此,我们花了大量的时间来介绍Django的模型的基本结构、字段类型、字段参数,其实Django远远不止这些字段。现在很多我们用不上,没关系,等需要用到的时候我们再查看官方文档。

Django团队为我们考虑到这么多需要用到的功能,可能看到这大家都有点累了,正是如此,我们才能看出Django这一框架的功能强大。

相关文章
|
4月前
|
SQL 存储 数据库
Django模型查询与性能调优:告别N+1问题
本文详解Django数据库查询基础与优化技巧,涵盖QuerySet使用、关联查询(一对多/多对多)、N+1查询问题及解决方案(select_related、prefetch_related)、高级查询方法及项目实战中的数据权限控制实现。
185 0
|
5月前
|
存储 数据库 Python
Django模型关系:从一对多到多对多全解析
本文详解Django模型关系:一对多(ForeignKey)及多对多(ManyToManyField)关系的定义、操作与优化技巧。同时探讨外键约束的使用场景与权衡策略。
252 0
|
5月前
|
存储 关系型数据库 MySQL
Django模型开发:模型字段、元数据与继承全方位讲解
本文将全面介绍 Django 模型的关键知识点,包括模型字段类型、映射、常用配置选项以及模型继承等高级特性,帮助开发者快速掌握模型设计与使用技巧。
163 0
|
Java API 数据库
Django:从入门到精通
【11月更文挑战第18天】Django是一个由Python编写的高级Web应用框架,以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发,旨在简化Web应用的开发过程。作为一个开放源代码项目,Django迅速吸引了大量的开发者和用户,成为了Python Web开发领域的重要工具之一。
313 1
|
机器学习/深度学习 前端开发 网络架构
Django如何调用机器学习模型进行预测
Django如何调用机器学习模型进行预测
296 5
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
239 5
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
185 4
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)
185 2
|
存储 数据库 Python
Python编程--Django入门:用户账户(一)
Python编程--Django入门:用户账户(一)
144 1
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
950 1