Django模型
-
定义:模型是 Django 中用于定义数据库结构的 Python 类。每个模型类对应数据库中的一张表,类的属性对应表的字段。
-
作用:通过模型,Django 可以将 Python 代码与数据库表结构关联起来,开发者无需直接编写 SQL 语句即可操作数据库。
常用字段
字段类型 | 说明 | 示例 |
---|---|---|
CharField | 用于存储较短的字符串,必须指定 max_length 。 | name = models.CharField(max_length=100) |
TextField | 用于存储大段文本,不需要指定最大长度。 | description = models.TextField() |
IntegerField | 用于存储整数。 | age = models.IntegerField() |
BooleanField | 用于存储布尔值(True /False )。 | is_published = models.BooleanField(default=False) |
DateField | 用于存储日期(年月日)。 | birth_date = models.DateField() |
DateTimeField | 用于存储日期和时间。 | created_at = models.DateTimeField(auto_now_add=True) |
EmailField | 用于存储电子邮件地址,会自动验证格式。 | email = models.EmailField(max_length=254) |
URLField | 用于存储 URL,会自动验证格式。 | website = models.URLField(max_length=200) |
DecimalField | 用于存储固定精度的十进制数,需指定 max_digits 和 decimal_places 。 | price = models.DecimalField(max_digits=10, decimal_places=2) |
FloatField | 用于存储浮点数。 | rating = models.FloatField() |
ForeignKey | 用于定义多对一关系,指向另一个模型。 | author = models.ForeignKey(Author, on_delete=models.CASCADE) |
OneToOneField | 用于定义一对一关系。 | profile = models.OneToOneField(Profile, on_delete=models.CASCADE) |
ManyToManyField | 用于定义多对多关系。 | tags = models.ManyToManyField(Tag) |
FileField | 用于上传文件。 | file = models.FileField(upload_to='uploads/') |
ImageField | 用于上传图片,继承自 FileField ,会自动验证是否为图片。 | photo = models.ImageField(upload_to='photos/') |
UUIDField | 用于存储 UUID(通用唯一标识符)。 | id = models.UUIDField(primary_key=True, default=uuid.uuid4) |
AutoField | 自动递增的整数字段,通常用于主键。 | id = models.AutoField(primary_key=True) |
BigAutoField | 类似 AutoField ,但支持更大的范围(64 位整数)。 | id = models.BigAutoField(primary_key=True) |
SlugField | 用于存储短标签(URL 友好的字符串),通常用于 URL。 | slug = models.SlugField(unique=True) |
BinaryField | 用于存储二进制数据。 | data = models.BinaryField() |
DurationField | 用于存储时间间隔(如天数、小时数等)。 | duration = models.DurationField() |
GenericIPAddressField | 用于存储 IPv4 或 IPv6 地址。 | ip_address = models.GenericIPAddressField() |
JSONField | 用于存储 JSON 数据。 | metadata = models.JSONField() |
常用参数
参数 | 说明 |
---|---|
max_length | 指定字段的最大长度(如 CharField )。 |
null | 如果为 True ,数据库中将允许存储 NULL 值。 |
blank | 如果为 True ,字段在表单中可以为空。 |
default | 指定字段的默认值。 |
unique | 如果为 True ,字段值必须在表中唯一。 |
primary_key | 如果为 True ,该字段将作为模型的主键。 |
choices | 提供一个可选的选项列表(如 GENDER_CHOICES = [('M', 'Male'), ('F', 'Female')] )。 |
auto_now | 每次保存对象时自动设置为当前时间(常用于 DateTimeField )。 |
auto_now_add | 对象第一次创建时自动设置为当前时间(常用于 DateTimeField )。 |
upload_to | 指定文件上传的目录(用于 FileField 和 ImageField )。 |
on_delete | 指定外键关联的对象被删除时的行为(如 CASCADE 、SET_NULL 等)。 |
注意:id 字段会自动生成,无需显式定义(Django 默认会添加一个自增的 id 主键,如果不是这种情况需要手动添加字段)
from django.db import models
class User(models.Model):
username = models.CharField(max_length=100, unique=True)
password = models.CharField(max_length=100)
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
def __str__(self):
return self.username
举个例子models中添加一个商品 类中有id(自动生成)、name、code、price、crate_time、update_time大家自己创建下 按照上面的命令
class Product(models.Model):
# id 字段会自动生成,无需显式定义(Django 默认会添加一个自增的 id 主键)
name = models.CharField(max_length=100, verbose_name="商品名称")
code = models.CharField(max_length=50, unique=True, verbose_name="商品编码")
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品价格")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
Migrations
-
定义:迁移是 Django 用来管理数据库模式变更的机制。每次修改模型后,Django 会生成一个迁移文件,记录模型的变化。
-
作用:迁移文件允许你将数据库模式从一种状态更新到另一种状态,同时保留现有数据。
-
生成迁移文件:使用
python manage.py makemigrations
命令,Django 会检测模型的变更,并生成相应的迁移文件。-
例如,修改user模型后,运行
makemigrations
会生成一个迁移文件,记录这些变更。
-
product例子生成表名:myapp_product
makemigrations
和 migrate
的关系
-
makemigrations
:生成迁移文件,记录模型的变更。 -
migrate
:应用迁移文件,将变更同步到数据库中。 -
流程:
-
修改模型(如添加字段、修改字段类型等)。
-
运行
python manage.py makemigrations
,生成迁移文件。(注意如果说有报错需要查看自己的settings.py中是否包含INSTALLED_APPS是否包含了myapp) -
运行
python manage.py migrate
,将迁移应用到数据库(可以查看数据库中建立的表,生成的表是app名称_对象名)。
-