在 Django 中定义模型需要继承 django.db.models.Model
类,并通过类属性定义字段。以下是详细步骤和示例:
1. 基础模型定义
from django.db import models
class Book(models.Model):
# 定义字段
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
is_published = models.BooleanField(default=True)
# 可选:定义元数据
class Meta:
ordering = ["-publish_date"] # 默认按发布日期倒序排列
# 可选:定义对象的人类可读表示
def __str__(self):
return f"{self.title} by {self.author}"
2. 字段类型与参数
-
常用字段类型:
CharField
: 字符串字段 (max_length
必需)TextField
: 长文本IntegerField
/DecimalField
: 整数/小数DateField
/DateTimeField
: 日期/时间 (auto_now_add=True
可自动记录创建时间)ForeignKey
: 外键关联 (on_delete
必需)ManyToManyField
: 多对多关联
-
常用参数:
default
: 默认值unique
: 约束blank
/null
: 表单验证和数据库空值
3. 外键关联示例
class Author(models.Model):
name = models.CharField(max_length=100)
country = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(
Author,
on_delete=models.CASCADE, # 作者删除时级联删除书籍
related_name="books" # 反向查询名称(author.books)
)
4. 自定义方法
class Book(models.Model):
# ... 字段定义 ...
# 自定义业务逻辑方法
def apply_discount(self, percent):
self.price = self.price * (1 - percent/100)
self.save()
# 生成 URL(需在 urls.py 中配置对应路由)
def get_absolute_url(self):
from django.urls import reverse
return reverse("book_detail", args=[str(self.id)])
5. 执行迁移
定义模型后,需生成并应用数据库迁移:
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 执行迁移
完整示例
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=200, verbose_name="标题")
content = models.TextField(verbose_name="内容")
author = models.ForeignKey(
"auth.User",
on_delete=models.CASCADE,
verbose_name="作者"
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
verbose_name = "博客"
verbose_name_plural = "博客"
ordering = ["-created_at"]
def __str__(self):
return self.title
关键点
- 继承
models.Model
:所有模型必须直接或间接继承此类。 - 字段即数据库列:每个类属性对应数据库表中的一列。
- 模型元数据:通过
class Meta
定义索引、排序等。 - 关系字段:使用
ForeignKey
,ManyToManyField
,OneToOneField
定义关联。
通过这种方式,Django 会自动生成数据库表并处理 SQL 操作,开发者只需关注业务逻辑。
(本文来源:nzw6.com)