一文掌握Django模型——认识模型

本系列专治,不会写模型,不懂字段,不懂字段参数设置等等疑难杂症

这篇文章主要是介绍需要知道模型的基本知识

一、Django 模型是什么?

模型就是 Python 类 ,它对应数据库中的一张

每个类属性(字段)对应表中的一个

所有的模型都间接或直接继承models.Model这个类

导包时只需要导from django.db import models即可(这里涉及一个设计模式,学有余力可以点进去了解)

python 复制代码
# models.py
from django.db import models

class Book(models.Model):
    # 先不管字段设置的约束
    title = models.CharField(...)
    price = models.DecimalField(...)

当进行表迁移时 会创建一张叫 appname_book 的表,有 id, title, price 三列。

appname指的是当前这个app设置的名字。

二、常用字段类型(Field Types)------ 先记住这 8 个就够了!

初学者先掌握这几个最常用的,如果有需求用到不认识的再去查资料学习即可。不要给自己增加学习负担!!!!!!

字段类型 用途 必填参数 示例
CharField 短文本(如标题、名字) max_length name = models.CharField(max_length=50)
TextField 长文本(如文章内容) content = models.TextField()
IntegerField 整数 age = models.IntegerField()
DecimalField 精确小数(如价格) max_digits, decimal_places price = models.DecimalField(max_digits=8, decimal_places=2)
BooleanField 布尔值(True/False) is_active = models.BooleanField(default=True)
DateTimeField 日期+时间 auto_now, auto_now_add created_at = models.DateTimeField(auto_now_add=True)
EmailField 邮箱(自动校验格式) email = models.EmailField()
URLField URL(自动校验) website = models.URLField()

三、通用字段选项(Field Options)------ 控制字段行为

这些参数几乎所有字段都能用:

参数 作用 示例
null=True 数据库允许 NULL models.CharField(..., null=True)
blank=True 表单验证时可为空(和 null 不同!) models.CharField(..., blank=True)
default=... 默认值 status = models.CharField(default="draft")
unique=True 值必须唯一 mobile = models.CharField(unique=True)
verbose_name 人类可读名称(用于 Admin) name = models.CharField("姓名", max_length=50)

重点区分:

  • null=True → 数据库层面允许 NULL
  • blank=True → Django 表单/验证时允许空(比如 Admin 后台不填也能保存)
  • 文本字段(CharField/TextField)通常设 blank=True,但不要设 null=True(除非你真想存 NULL 而不是空字符串)

四、关系字段(Relational Fields)------ 外键、一对一、多对多

1. 外键(ForeignKey)------ "多" 一方持有外键

场景:博客系统

  • 一个 作者(Author) 可以写多篇 文章(Post)
  • 一篇文章只能属于一个作者
python 复制代码
# 以下代码仅用于案例示范

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=50)


class Post(models.Model):
    title = models.CharField(max_length=30)
    author = models.ForeignKey(to=Author,on_delete=models.CASCADE)
  • Post 是"多"的一方,所以它持有 ForeignKey 指向 Author
  • on_delete=models.CASCADE:如果作者被删除,他的所有文章也自动删除
  • 在数据库中,Post 表会多一列 author_id(存储 Author 的 id)

关于on_delete的其他模式后续会提到

记住口诀:"谁属于谁,谁就加外键"

文章属于作者 → 文章模型加 ForeignKey(Author)

2. 一对一(OneToOneField)------ 比如用户扩展信息

python 复制代码
class User(models.Model):
    username = models.CharField(max_length=30)

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()
  • 一个用户只有一个档案,一个档案只属于一个用户

为什么会有一对一,是因为不希望主表字段过多,所以把OneToOneField设置在副表

3. 多对多(ManyToManyField)------ 比如标签

  • 一篇文章可以有多个标签,一个标签可用于多篇文章
  • Django 会自动创建中间表 post_tags(含 post_id 和 tag_id)
python 复制代码
class Tag(models.Model):
    name = models.CharField(max_length=30)

class Post(models.Model):
    title = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag)

Tips: ManyToManyField 放在任一方都可以,但通常放在"主"模型上(如 Post)

五、外键的常用参数(重点!)

python 复制代码
author = models.ForeignKey(
    Author,                    # 关联哪张表的表名
    on_delete=models.CASCADE,  # 必填!
    related_name="posts",      # 反向查询名
    null=True,                 # 允许文章暂时没有作者?
    blank=True                 # Admin 表单可不选作者?
)

关键参数说明:

参数 作用
on_delete 必须指定! 当关联对象被删除时怎么办: - CASCADE:级联删除 - SET_NULL:设为 NULL(需配合 null=True) - PROTECT:阻止删除
related_name 从 Author 反向查 Post 时用的名字: author.posts.all()(默认是 post_set
to_field 默认关联主键(id),可改为其他唯一字段(少用)

六、总结

以上五大内容涵盖了定义模型常用的字段,先对此有个了解即可。下篇文章中,我会以一个实战案例,涉及从模型定义,到增删改查,外键关联查询等等内容。敬请期待

相关推荐
雾隐潇湘2 小时前
第三章 流程控制语句
开发语言·python
add45a2 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
江不清丶2 小时前
事务隔离级别深度解析:从理论到MySQL实现
数据库·mysql
瓦哥架构实战2 小时前
CentOS 7 编译安装 Python 3.9 解决 SSL 模块缺失问题
开发语言·python
骇客野人2 小时前
向量数据库Milvus的安装使用
数据库·milvus
python猿2 小时前
打卡Python王者归来--第29天
python
幸福清风2 小时前
【Python】运维效率翻倍|批处理日志分割升级Python GUI,一键打包exe无乱码,零基础也能用
python·打包·日志分割
小狗丹尼4003 小时前
JSON 基础认知、数据转换与 Flask 前后端交互全解
python·flask·json