本系列专治,不会写模型,不懂字段,不懂字段参数设置等等疑难杂症
这篇文章主要是介绍需要知道模型的基本知识
一、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→ 数据库层面允许 NULLblank=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指向Authoron_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),可改为其他唯一字段(少用) |
六、总结
以上五大内容涵盖了定义模型常用的字段,先对此有个了解即可。下篇文章中,我会以一个实战案例,涉及从模型定义,到增删改查,外键关联查询等等内容。敬请期待