本系列专治不会写模型不懂字段不懂字段参数设置等等疑难杂症这篇文章主要是介绍需要知道模型的基本知识一、Django 模型是什么模型就是Python 类它对应数据库中的一张表。每个类属性字段对应表中的一个列。所有的模型都间接或直接继承models.Model这个类导包时只需要导from django.db import models即可这里涉及一个设计模式学有余力可以点进去了解# 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_lengthname models.CharField(max_length50)TextField长文本如文章内容无content models.TextField()IntegerField整数无age models.IntegerField()DecimalField精确小数如价格max_digits,decimal_placesprice models.DecimalField(max_digits8, decimal_places2)BooleanField布尔值True/False无is_active models.BooleanField(defaultTrue)DateTimeField日期时间auto_now,auto_now_addcreated_at models.DateTimeField(auto_now_addTrue)EmailField邮箱自动校验格式无email models.EmailField()URLFieldURL自动校验无website models.URLField()三、通用字段选项Field Options—— 控制字段行为这些参数几乎所有字段都能用参数作用示例nullTrue数据库允许 NULLmodels.CharField(..., nullTrue)blankTrue表单验证时可为空和null不同models.CharField(..., blankTrue)default...默认值status models.CharField(defaultdraft)uniqueTrue值必须唯一mobile models.CharField(uniqueTrue)verbose_name人类可读名称用于 Adminname models.CharField(姓名, max_length50)重点区分nullTrue→ 数据库层面允许 NULLblankTrue→ Django 表单/验证时允许空比如 Admin 后台不填也能保存文本字段CharField/TextField通常设blankTrue但不要设nullTrue除非你真想存 NULL 而不是空字符串四、关系字段Relational Fields—— 外键、一对一、多对多1. 外键ForeignKey—— “多” 一方持有外键场景博客系统一个作者Author可以写多篇文章Post一篇文章只能属于一个作者# 以下代码仅用于案例示范 from django.db import models class Author(models.Model): name models.CharField(max_length50) class Post(models.Model): title models.CharField(max_length30) author models.ForeignKey(toAuthor,on_deletemodels.CASCADE)Post是“多”的一方所以它持有ForeignKey指向Authoron_deletemodels.CASCADE如果作者被删除他的所有文章也自动删除在数据库中Post表会多一列author_id存储 Author 的 id关于on_delete的其他模式后续会提到记住口诀“谁属于谁谁就加外键”文章属于作者 → 文章模型加ForeignKey(Author)2. 一对一OneToOneField—— 比如用户扩展信息class User(models.Model): username models.CharField(max_length30) class Profile(models.Model): user models.OneToOneField(User, on_deletemodels.CASCADE) bio models.TextField()一个用户只有一个档案一个档案只属于一个用户为什么会有一对一是因为不希望主表字段过多所以把OneToOneField设置在副表3. 多对多ManyToManyField—— 比如标签一篇文章可以有多个标签一个标签可用于多篇文章Django 会自动创建中间表post_tags含 post_id 和 tag_idclass Tag(models.Model): name models.CharField(max_length30) class Post(models.Model): title models.CharField(max_length100) tags models.ManyToManyField(Tag)TipsManyToManyField放在任一方都可以但通常放在“主”模型上如 Post五、外键的常用参数重点author models.ForeignKey( Author, # 关联哪张表的表名 on_deletemodels.CASCADE, # 必填 related_nameposts, # 反向查询名 nullTrue, # 允许文章暂时没有作者 blankTrue # Admin 表单可不选作者 )关键参数说明参数作用on_delete必须指定当关联对象被删除时怎么办-CASCADE级联删除-SET_NULL设为 NULL需配合nullTrue-PROTECT阻止删除related_name从 Author 反向查 Post 时用的名字author.posts.all()默认是post_setto_field默认关联主键id可改为其他唯一字段少用六、总结以上五大内容涵盖了定义模型常用的字段先对此有个了解即可。下篇文章中我会以一个实战案例涉及从模型定义到增删改查外键关联查询等等内容。敬请期待