一文掌握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),可改为其他唯一字段(少用)

六、总结

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

相关推荐
ClouGence42 分钟前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
你好潘先生2 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师3 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码3 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf3 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes16 小时前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
先吃饱再说18 小时前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
用户83562907805118 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
Nturmoils18 小时前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend20 小时前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent