文档
字段类型详解
字符串相关字段
class StringFields(models.Model):
# CharField - 短文本
title = models.CharField(
max_length=200,
verbose_name="标题",
help_text="请输入标题"
)
# TextField - 长文本
content = models.TextField(
blank=True,
null=True
)
# SlugField - URL友好字符串
slug = models.SlugField(
max_length=50,
unique=True
)
# UUIDField - 唯一标识符
uuid = models.UUIDField(
default=uuid.uuid4,
editable=False,
unique=True
)
数字相关字段
class NumberFields(models.Model):
# IntegerField - 整数
views = models.IntegerField(default=0)
# PositiveIntegerField - 正整数
positive_count = models.PositiveIntegerField(default=0)
# SmallIntegerField - 小整数
small_number = models.SmallIntegerField()
# FloatField - 浮点数
rating = models.FloatField(default=0.0)
# DecimalField - 十进制数
amount = models.DecimalField(
max_digits=10, # 最大位数
decimal_places=2, # 小数位数
default=0.00
)
日期时间字段
class DateTimeFields(models.Model):
# DateField - 日期
birth_date = models.DateField()
publish_date = models.DateField(auto_now_add=True)
# DateTimeField - 日期时间
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
scheduled_time = models.DateTimeField()
# TimeField - 时间
start_time = models.TimeField()
end_time = models.TimeField()
布尔和选择字段
class ChoiceFields(models.Model):
STATUS_CHOICES = [
('draft', '草稿'),
('published', '已发布'),
('archived', '已归档'),
]
CATEGORY_CHOICES = [
(1, '技术'),
(2, '生活'),
(3, '旅游'),
]
# BooleanField - 布尔值
is_featured = models.BooleanField(default=False)
# CharField with choices - 选择字段
status = models.CharField(
max_length=20,
choices=STATUS_CHOICES,
default='draft'
)
# IntegerField with choices
category = models.IntegerField(
choices=CATEGORY_CHOICES,
default=1
)
文件相关字段
class FileFields(models.Model):
# FileField - 文件
document = models.FileField(
upload_to='documents/%Y/%m/%d/',
max_length=100
)
# ImageField - 图片
photo = models.ImageField(
upload_to='photos/%Y/%m/%d/',
height_field='image_height',
width_field='image_width'
)
image_height = models.IntegerField(editable=False, null=True)
image_width = models.IntegerField(editable=False, null=True)
关系字段
ForeignKey - 多对一关系
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
# 外键关系
author = models.ForeignKey(
Author,
on_delete=models.CASCADE, # 删除作者时删除所有书籍
related_name='books', # 反向关系名称
related_query_name='book'
)
# 其他on_delete选项
publisher = models.ForeignKey(
'Publisher',
on_delete=models.SET_NULL, # 设置为NULL
null=True,
blank=True
)
category = models.ForeignKey(
'Category',
on_delete=models.PROTECT, # 阻止删除
)
# 使用示例
author = Author.objects.get(name="鲁迅")
books = author.books.all() # 通过related_name访问
ManyToManyField - 多对多关系
class Tag(models.Model):
name = models.CharField(max_length=50)
class Article(models.Model):
title = models.CharField(max_length=200)
tags = models.ManyToManyField(
Tag,
related_name='articles',
blank=True
)
# 使用through自定义中间表
collaborators = models.ManyToManyField(
'User',
through='ArticleCollaborator',
through_fields=('article', 'user')
)
# 中间表
class ArticleCollaborator(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
role = models.CharField(max_length=50)
joined_date = models.DateField(auto_now_add=True)
OneToOneField - 一对一关系
class UserProfile(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
primary_key=True, # 常用作主键
related_name='profile'
)
bio = models.TextField(blank=True)
location = models.CharField(max_length=100, blank=True)
# 使用示例
user = User.objects.get(id=