文档

字段类型详解

字符串相关字段

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=