模型常用字段

常用字段

Django中,定义了一些Field来与数据库表中的字段类型来进行映射。

AutoField

映射到数据库中的是int类型,可以有自动增长的特性。

如果不指定主键,模型会自动生成一个叫做 id的自动增长模型。

field可以指定名字

BigAutoField

64位的整型,对应数据库的 bigInt,类似 AutoField ,不过产生的数据的范围是从 1~9223372036854775807

BooleanField

在模型层面接收 True或者 False。对应数据库的 tinyint. 如果没有指定默认值,默认值是 None

默认null=False

NullBooleaField

如果要指定null=True,使用NullBooleanField代替。

CharField

对应数据库的 varchar。 在python层面是普通的字符串

必须指定最大的长度(max_length)

如果超过254个字符,不建议使用,而是使用TextFile

DateField

日期类型。python中的datetime。 对应数据库的date

可以传递以下几个参数:

  1. auto_now :在每次这个数据保存(save())的时候,都使用当前的时间。类型为True or False可用于记录修改日期。
  2. auto_now_add :在每次数据第一次被添加进去的时候,都使用当前的时间。类型为True or False。可用于记录第一次入库的时间。

DateTimeField

日期时间类型。可以存储日期和时间。对应数据库中的datetime类型。

同样也有auto_nowauto_now_add属性

TimeField

时间类型。对应数据库的time。在python中是datetime.time类型

EmailField

  • 类似于CharField.在数据库底层也是一个varchar类型。默认长度是254个字符。
    • 在数据库层面无限制。但是在ModelForm等表单相关操作的时候会起作用

FiledField

  • 用来存储文件的

ImageField

  • 用来存储图片文件的。

FloatFiled

  • 浮点类型。对应数据库的float

IntegerField

  • 整型。区间是(-2) ~ 2 -1

BigIntegerField

  • 大整型。区间是 (-2) ~ 2 -1

PositiveIntegerField

  • 正整型。区间是 0 ~ 2 -1

SmallIntegerField

  • 小整型。区间是 (-2) ~ 2 -1

PositiveSmallIntegerField

  • 正小整型。区间是 0 ~ 2 -1

TextField

  • 大量的文本类型。 对应数据库的longtext

UUIDField

  • 只能存储uuid格式的字符串。uuid是一个32位的全球唯一的字符串。一般用来作为主键。

URLField

  • 类似Charfield,只能用于存储url格式的字符串。默认的max_length为200

navie时间和aware时间

  1. navie时间: 幼稚。不知道自己的时间表示的是哪个时区。
  2. aware时间:清醒的。知道自己的时间表示的是哪个时区。

pytz库:
  • 专门用来处理时区的库。这个库会经常更新一些时区的数据。安装Django默认安装。

astimezone方法
  • 将一个时区的时间转换为另外一个时区的时间。
  • 只能被aware类型的时间调用。不能被navie类的时间调用
    1. import pytz
    2. from datetime import datetime
    3. now = datetime.now() # 这是一个navie类型的时间
    4. utc_timezone = pytz.timezone("UTC") # 定义UTC的时区对象
    5. utc_now = now.astimezone(utc_timezone) # 将当前的时间转换为UTC时区的时间
    6. >> ValueError: astimezone() cannot be applied to a navie datetime
    7. # 抛出一个异常。navie类型的时间不能调用astimezone方法
    8. now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # 修改属性,变成一个aware时间类型
    9. utc_now = now.astimezone(utc_timezone)
    10. # 就可以正确调用astimezone()

replace方法
  • 可以将一个时间的某些属性进行更改

django.utils.timezone.now
  • settings.py中,如果USE_TZ = True,则now()返回aware类型的UTC时间.如果没有设置,则返回navie类型的时间。 ```python from django.utils.timezone import now # 要用到话这样import即可

now()

  1. <a name="django.utils.timezone.localtime"></a>
  2. ##### django.utils.timezone.localtime
  3. - 根据`setting.py`中的`TIME_ZONE`来将一个`aware`类型的时间转换为`TIME_ZONE`指定时区的时间。
  4. ```python
  5. from django.utils.timezone import localtime # 要用到话这样import即可
  6. target_time = localtime(aware_time)