Django模型字段

字段选项

null

如果是 True, Django 将在数据库中存储空值为 NULL。默认为 False

避免在基于字符串的字段上使用 null,如 CharField 和 TextField。如果一个基于字符串的字段有 null=True,这意味着它有两种可能的“无数据”值。NULL,和空字符串。在大多数情况下,“无数据”有两种可能的值是多余的,Django 的惯例是使用空字符串,而不是 NULL。一个例外是当一个 CharField 同时设置了 unique=True 和 blank=True。在这种情况下,null=True 是需要的,以避免在保存具有空白值的多个对象时违反唯一约束。

无论是基于字符串的字段还是非字符串的字段,如果希望在表单中允许空值,还需要设置 blank=True,因为 null 参数只影响数据库的存储。

blank

如果是 True ,该字段允许为空。默认为 False 。

注意,这与 null 不同。 null 纯属数据库相关,而 blank 则与验证相关。如果一个字段有 blank=True,表单验证将允许输入一个空值。如果一个字段有 blank=False,则该字段为必填字段。

choice

在Django中,choices字段选项是一个非常实用的特性,它允许你为某个模型字段定义一组固定的可选值。这些选项通常会在数据库中以原始值存储,但在表单中或模板渲染时会显示为更加友好的人类可读的文本。以下是choices字段选项的几种用法定义和详细解读:

基本用法

choices是一个由二元元组组成的可迭代对象,每个元组包含两个元素:第一个元素是存储在数据库中的实际值,通常为整数或字符串;第二个元素是在表单或模板中展示给用户的内容,通常是描述性的文本。

class SexType(objects):
    MALE = 'M'
    FEMALE = 'F'
    UNKNOWN = 'N/A'
 
    CHOICES = (
        (MALE, '男'),
        (FEMALE, '女'),
        (UNKNOWN, u'未知'),
    )
 
 
class User(models.Model):
    username = models.CharField(max_length=20, unique=True, verbose_name='名称')
    sex = models.CharField(max_length=3, default=SexType.UNKNOWN, choices=SexType.CHOICES, verbose_name='性别')

在这个例子中,size字段被限制为'S', 'M', 'L', 'XL'四个值,而用户在表单中看到的将是'Small', 'Medium', 'Large', 'Extra Large'。

在模板中的使用

一旦模型字段定义了choices,在模板中你可以使用get_FOO_display()方法来获取并显示该字段的可读文本。

<p>{{ user.get_gender_display }}</p>

这将输出person实例的gender字段对应的友好文本,比如'Male'、'Female'或'Other'。

在序列化器中的使用

class UserSerializer(serializers.ModelSerializer):
    sex_t = serializers.CharField(source='get_sex_display', read_only=True, required=False)
    #source='get_sex_display' 固定写法get_xxx_display
    class Meta:
        model = User
        fields = ('id', 'name', 'sex', 'sex_t')
 
序列化结果:
[
    {"id": 1,
     "name": "小明",
     "sex": "M",
     "sex_t": "男"
    },
    {"id": 2,
     "name": "小王",
     "sex": "F",
     "sex_t": "女"
    }
]

使用枚举类(Django 3.0+)

Django 3.0之后,推荐使用TextChoicesIntegerChoices枚举类来定义choices,这能提供更好的类型安全和代码可读性

from django.db import models
from django.utils.translation import gettext_lazy as _

class Gender(models.TextChoices):
    MALE = 'M', _('Male')
    FEMALE = 'F', _('Female')
    OTHER = 'O', _('Other')

class Person(models.Model):
    gender = models.CharField(max_length=1, choices=Gender.choices)
class Card(models.Model):

    class Suit(models.IntegerChoices):
        DIAMOND = 1
        SPADE = 2
        HEART = 3
        CLUB = 4

    suit = models.IntegerField(choices=Suit.choices)

db_index

  • 含义db_index=True 指示Django应该在数据库中为此字段创建索引。索引能够显著提高基于该字段的查询速度,尤其是在大型数据集上。然而,创建索引也会占用额外的磁盘空间,并可能略微减慢插入和更新操作的速度。
email = models.EmailField(db_index=True)

default

  • 含义default 参数指定了当创建一个新的模型实例但没有为该字段提供值时,使用的默认值。这对于给字段提供一个初始值或者在某些情况下确保字段非空非常有用。
created_at = models.DateTimeField(auto_now_add=True, default=timezone.now)

help_text

  • 含义help_text 参数用于提供关于字段的附加说明或提示信息,通常在表单或Django管理界面中展示,帮助用户更好地理解字段的用途或如何填写。
password = models.CharField(max_length=128, help_text="请输入至少8位密码")

primary_key

  • 含义primary_key=True 用于标记一个字段作为表的主键。主键是一个或多个字段的组合,用于唯一地标识表中的每一行记录。每个表只能有一个主键,且主键的值必须唯一,且不能为空(不允许NULL)。主键通常用于建立表之间的关联,以及在查询时快速定位记录。
id = models.AutoField(primary_key=True)

unique

  • 含义unique=True 表示该字段的值在表中必须是唯一的,不允许重复,但与主键不同,它可以有多个,并且可以为空(NULL)。这个选项常用于需要唯一性但不作为主键的字段,如用户邮箱。
username = models.CharField(max_length=30, unique=True)

auto_now_add

  • 用途auto_now_add=True用于在模型实例首次被创建并保存到数据库时自动设置字段的值为当前时间。这意味着该字段的值只会在记录创建时被设置一次,之后即使对象被多次保存,该字段的值也不会再发生变化。
  • 场景:它非常适合用于记录数据的创建时间,如文章的发布日期、用户注册时间等场景。
from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
  • 在上述示例中,created_at字段会在博客文章首次被保存时自动填充为当前时间。

auto_now

  • 用途auto_now=True则会在每次对象被保存时自动更新该字段为当前时间。这意味着每当模型实例被修改并重新保存,该字段的值就会被更新为最新的时间。
  • 场景:适用于需要追踪记录最后修改时间的场景,如文档的最后编辑时间、用户资料的最后更新时间等
class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    last_update = models.DateTimeField(auto_now=True)
  • 在这个例子中,每当用户资料被修改并保存,last_update字段的值就会被更新为当前时间。

注意事项

  • 不可手动赋值:当字段设置了auto_now_addauto_now时,通常不允许开发者直接为这些字段赋值。在使用ModelForm创建表单时,这些字段通常会被自动排除,防止用户输入。
  • 与默认值(default)的区别auto_now_addauto_nowdefault选项不同,后者仅在创建对象时如果没有为字段提供值时才生效,并且不会在每次保存时自动更新。

verbose_name

  • 含义verbose_name 参数允许你为字段提供一个更长、更易理解的名称,以提高用户体验。
date_of_birth = models.DateField(verbose_name="出生日期")

 字段类型

CharField

用途:用于存储短文本字符串,类似于数据库中的VARCHAR类型。可以指定max_length来限制字符串的最大长度。

class Author(models.Model):
    name = models.CharField(max_length=100)

TextField

用途:用于存储大文本数据,如文章内容、评论等,类似于数据库中的TEXT类型。

class BlogPost(models.Model):
    content = models.TextField()

IntegerField

用途:用于存储整数。

class Product(models.Model):
    stock = models.IntegerField()

FloatField

用途:用于存储浮点数。

class Product(models.Model):
    price = models.FloatField()

BooleanField

用途:用于存储布尔值(True或False)。

class User(models.Model):
    is_active = models.BooleanField(default=True)

DateField

用途:存储日期(不含时间部分)。

class DateField(auto_now=False, auto_now_add=False, **options)¶
一个日期,在 Python 中用一个 datetime.date 实例表示。有一些额外的、可选的参数。

DateField.auto_now
每次保存对象时,自动将该字段设置为现在。对于“最后修改”的时间戳很有用。
请注意,当前日期 总是 被使用,而不仅仅是一个你可以覆盖的默认值。

只有在调用 Model.save() 时,该字段才会自动更新。
当以其他方式对其他字段进行更新时,如 QuerySet.update(),该字段不会被更新,
尽管你可以在这样的更新中为该字段指定一个自定义值。

DateField.auto_now_add
当第一次创建对象时,自动将该字段设置为现在。对创建时间戳很有用。
请注意,当前日期是 始终 使用的;它不是一个你可以覆盖的默认值。
因此,即使你在创建对象时为该字段设置了一个值,它也会被忽略。
如果你想修改这个字段,可以设置以下内容来代替 auto_now_add=True :

对于 DateField: default=date.today ——来自 datetime.date.today()
对于 DateTimeField: default=timezone.now ——来自 django.utils.timezone.now()

class Event(models.Model):
    start_date = models.DateField()

DateTimeField

用途:存储日期和时间。

一个日期和时间,在 Python 中用一个 datetime.datetime 实例表示。与 DateField 一样,使用相同的额外参数。

class LogEntry(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)

DecimalField

用途:用于存储精确的十进制数,适用于货币等需要精确计算的场景。

class Transaction(models.Model):
    amount = models.DecimalField(max_digits=10, decimal_places=2)

EmailField

用途:专门设计用于存储电子邮件地址的字段,提供了内置的验证来确保输入符合电子邮件的标准格式。

class UserProfile(models.Model):
    email = models.EmailField(max_length=254, unique=True)

URLField

用途:用于存储网址(URL),可选地进行格式验证。

class WebLink(models.Model):
    url = models.URLField(max_length=200)

FileField 和 ImageField

用途:用于存储文件和图像文件,它们都与文件系统交互,并且可以指定上传文件的存储位置。ImageFieldFileField的子类,专为图像处理做了优化,可以进行图像的缩略图生成等操作。

from django.db import models

class Document(models.Model):
    name = models.CharField(max_length=100)
    file = models.FileField(upload_to='documents/')

class Photo(models.Model):
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='photos/', height_field='height', width_field='width')
    height = models.IntegerField(null=True)
    width = models.IntegerField(null=True)

upload_to参数指定了文件上传后保存的相对路径。ImageField还可以通过height_fieldwidth_field关联到模型中的其他字段,用来存储图像的高度和宽度。

DurationField

用途DurationField 是 Django 模型中用于存储时间间隔的数据字段类型。它适合于记录那些不需要具体日期时间上下文,但需要精确到时、分、秒甚至毫秒的时间长度,比如任务耗时、音乐播放时长等。

from django.db import models
from datetime import timedelta

class Song(models.Model):
    title = models.CharField(max_length=100)
    duration = models.DurationField(null=True, blank=True)

# 创建一个歌曲实例
song = Song(title="My Favorite Song")
song.duration = timedelta(minutes=3, seconds=45)  # 设置时长为3分45秒
song.save()

# 访问和操作时长
print(song.duration.total_seconds())  # 输出总秒数
  • 30
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值