Django models.py 模型定义与数据库迁移完整指南

拾柒
拾柒
发布时间:2026-10-13| 2人浏览过
原创

本文详细解析 Django 中 models.py 的编写规范,涵盖常用字段类型及其在 Admin 后台的限制。重点讲解 makemigrations 与 migrate 命令的区别、作用范围及针对特定 App 的操作方法。针对 No migrations to apply 报错,提供清理迁移文件与 django_migrations 表的完整修复步骤,并附带 MySQL 配置示例。

Django 模型定义与字段类型

开始编写 models.py 文件,定义数据模型。


from django.db import models
# Create your models here.
class User_info(models.Model):
 username = models.CharField(max_length=25,verbose_name='用户名')
 password = models.CharField(max_length=25,verbose_name='密码')
 age = models.IntegerField()
 e_mail = models.EmailField()
 create_time = models.DateTimeField()
 update_time = models.DateTimeField()

字段类型

传统数据库通常包含字符串、数字、浮点数、时间类型和布尔类型等约五种基础字段。然而,Django 为了在后台 Admin 界面中更好地操作数据库,并限制对数据库的无效操作,在 Model 中设计了更为丰富的数据类型。


1、models.AutoField  自增列=int(11)
  如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,必须把该列设置为主键(primary_key=True)
2、models.CharField  字符串类型字段 必须加max_length参数
3、models.BooleanField 布尔类型字段=tinyint(1) 不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字类型=varchar 继承CharField,所以必须加max_lenght参数
5、models.DateField  日期字段类型date
  参数auto_now=True表示每次更新都会更新这个时间;参数auto_now_add表示只是第一次创建时添加,之后的更新不再改变
6、models.DateTimeField  日期字段类型datetime 同DateField的参数
7、models.Decimal  十进制小数类型=decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱)=varchar 对字符串进行正则表达式验证
9、models.FloatField  浮点类型=double
10、models.IntegerField  整形
11、models.BigIntegerField 长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6 验证时,会根据设置进行报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串类型,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField 图片
24、models.FilePathField 文件

数据库迁移命令详解

执行以下命令以记录对 models.py 的改动:


# 执行以下命令,记录我们对models.py的所有改动
python manage.py makemigrations

执行后生成如下文件结构:


# Generated by Django 2.1.2 on 2018-12-11 11:39
from django.db import migrations, models
class Migration(migrations.Migration):
 initial = True
 dependencies = [
 ]
 operations = [
  migrations.CreateModel(
   name='User_info',
   fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    ('username', models.CharField(max_length=25, verbose_name='用户名')),
    ('password', models.CharField(max_length=25, verbose_name='密码')),
    ('age', models.IntegerField()),
    ('e_mail', models.EmailField(max_length=254)),
    ('create_time', models.DateTimeField()),
    ('update_time', models.DateTimeField()),
   ],
  ),
 ]

具体代码如下:


#如下 这条命令的主要作用就是把这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性
python manage.py migrate

执行该命令后,数据库将生成如下数据表:

如上图所示,生成的表名默认以应用名命名。如果这不是我们期望的结果,可以通过添加两行代码来修正。

具体修改如下:


from django.db import models
# Create your models here.
from django.db import models
class User_info(models.Model):
 username = models.CharField(max_length=25,verbose_name='用户名')
 password = models.CharField(max_length=25,verbose_name='密码')
 age = models.IntegerField()
 e_mail = models.EmailField()
 create_time = models.DateTimeField()
 update_time = models.DateTimeField()
 class Meta:
  db_table = 'User_info'

修改代码后,重新执行相关命令。


# 执行以下命令,记录我们对models.py的所有改动
python manage.py makemigrations

此时,系统会生成一个新的 migrations 文件。

接下来,可以针对这个新文件执行迁移操作。


python manage.py migrate ModelMysql 0002_auto_20181211_1150

查看数据库表,确认新建的数据表已成功创建。

python manage.py makemigrations 命令用于记录我们对 models.py 所做的所有修改,并将这些修改迁移到 migrations 文件夹下生成相应的文件(例如 0001.py)。如果后续继续进行修改,可能会生成其他编号的文件,不一定是 0001。需要注意的是,此命令仅生成迁移文件,并未实际作用于数据库,这一点在上面的操作流程中已经体现。

当执行 python manage.py migrate 命令时,其主要作用是将 migrations 文件夹中新生成的迁移文件应用到数据库,从而更新数据库结构,例如创建数据表或增加字段属性。

另外需要注意,这两个命令默认情况下作用于全局,即对所有最新更改的 models 或 migrations 下的迁移文件执行相应操作。如果希望仅对部分 App 生效,可以执行以下命令:


python manage.py makemigrations appname
python manage.py migrate appname

如果希望精确到某一个特定的迁移文件,可以使用:


python manage.py migrate appname 文件名

常见迁移问题与解决方案

常见问题:

1、

No migrations to apply(Django 无法创建数据库中的表)

报错情况如下图所示:

解决办法:

第一步:

删除该 App 名称下 migrations 文件夹中除 __init__.py 之外的所有文件。

第二步:

进入数据库,找到 django_migrations 表,删除该 App 名称下的所有相关记录。

第三步:在项目目录下执行以下两条命令:


python manage.py makemigrations

python manage.py migrate

原因分析:

django_migrations 表记录了数据库对应表的修改历史。

每次修改后,执行第三步的命令,会在第一步提到的文件夹下生成新的修改文件,同时 django_migrations 表会记录这些变更过程。

2、


Warning: (3135, "'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.")
result = self._query(query)

修改 DATABASES 配置如下:


# MySQL adil 密码:helloyyj
DATABASES = {
 'default':{
  'ENGINE':'django.db.backends.mysql',
  'HOST':'127.0.0.1',
  'PORT':'3306',
  'NAME':'pyweb', # 数据库名
  'USER':'adil',
  'PASSWORD':'helloyyj',
  'OPTIONS':{
   'sql_mode': 'traditional'
  },
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。