模型常用属性
1、在Django中定义了一些Field来与数据库表中的字段类型进行映射:即使用Field来定义表中列值的数据类型

2、在model中添加字段的格式一般为:field_name = field_type(**field_options)

 

 

AutoField
1、映射到数据库中是int类型,可以有自动增长的特性。支持最大长度为11的整数

2、一般不需要使用这个类型:如果不指定主键,那么模型会自动的生成一个叫做id的自曾主键。当然,如果想执行一个其他名字的并且具有自动增长的主键,使用AutoField也是可以的

 

BigAutoField
自增长类型,用法同AutoField。映射到数据库中会成为20位的bigint类型

 

CharField
1、字符串类型,映射到数据库中会转换成varchar类型,使用时必须传入max_length属性用于定义该字符串的最大长度

2、如果存入的字符串长度会超过254个字符,就不建议使用CharField了,此时建议使用TextField

 

BooleanField
1、在模型层面接收的是布尔类型(True/False),映射到数据库中会变成长度只有1位的tinyint类型(1/0)

2、这个Field不接受null参数,要想使用可以为null的布尔类型的字段,就要使用NullBooleanField

3、比如我们在设计一个数据库表,需要标记数据是否被删除时,就可以用到这个Field类型:在实际中一般不会真正的删除一个数据,只会在数据库中标记这个数据是"被删除"状态(数据还存在)

例1:
⑴编辑模型类

⑵查看表结构

⑶编辑视图:访问步骤就没截图了

⑷查看插入的数据

注:
1、在Django模型中:如果在定义字段的时候,如果没有指定null=True的话,那么默认情况下,null=False,即不能为空

2、上面例子中我们也没有设置null=True,但是能正常插入user1是因为我们在定义remove字段的时候设置了默认值:remove = models.BooleanField(default=False)

3、如果上面例子中在定义remove字段时,没有设置null=True和默认值时,就不能插入user1了:remove = models.BooleanField()

4、BooleanField没有null参数,如果需要设置null参数的话可以使用NullBooleanField

 

DateTimeField
1、日期时间类型,在python中对应的是datetime.datetime类型,在映射到数据库中也是datetime类型。使用这个Field可以传递以下几个参数:
⑴auto_now=True:在每次这个数据保存的时候,都使用当前的时间。比如作为一个记录修改日期的字段
⑵auto_now_add=True:在每条数据第一次被添加进去的时候,使用当前的时间。比如作为一个记录第一次入库的字段

2、如果在setting.py中配置了USE_TZ=True,那么上两个默认值都来自于django.utils.timezone.now所转化来的值
⑴如果USE_TZ设置成了False那么存入和查询出来的时间都不是UTC时间且时间类型为navie类型。因此此时如果需要进行时区转换的话需要在视图函数中单独处理

3、在模板中将一个UTC时间转换成本地时间:
⑴首先模板HTML文件的开头导入tz:{% load tz %}
⑵在传递过来的时间变量utc_time中使用localtime过滤器:{{utc_time | localtime}}

4、其实,django知道我们的想法,已经为我们做好了配置,我们并不需要配置其他的东西就可以直接使用{{utc_time}},此时只要我们在setting.py文件中设置USE_TZ=True,TIME_ZONE='Asia/Shanghai',UTC时间变量在渲染到模板上的时候会自动的为我们加载成TIME_ZONE中所设置的时区的时间。

例2:插入数据
这个例子中因为我不想存入的时间也显示UTC时间,因此把USE_TZ设置成了False
⑴编辑模型类

⑵编辑视图

⑶查看插入的数据

DateField
日期类型,用法同DateTimeField,在python中对应的是datetime.date类型,在映射到数据库中是date类型

 

TimeField
时间类型,用法同DateTimeField,在python中对应的是datetime.time类型,在映射到数据库中是time类型

 

EmailField
在数据库底层也是一个varchar类型,默认最大长度是254个字符,当然也可以自己传递max_length参数,这个Field在数据库层面不会限制一定要传递符合email条件的字符串,只是以后在使用ModelForm表单验证时,会起作用

 

ImageField
用来存储图片文件的,后面在文件上传时会介绍

FileField
用来存储文件的,后面在文件上传时会介绍

 

FloatField
浮点数类型,映射到数据库中会变成Float类型

IntegerField
整数类型,映射到数据库中会变成11位的int类型

 

BigIntegerField
大整形。值的区间是-9223372036854775808——9223372036854775807

 

PositiveIntegerField
正整形。值的区间是0——2147483647

 

SmallIntegerField
小整形。值的区间是-32768——32767

PositiveSmallIntegerField
正小整形。值的区间是0——32767

 

TextField
大量的文本类型,映射到数据库中是longtext类型

URLField
类似于CharField,在数据库底层也是一个varchar类型,只不过只能用来存储url格式的字符串。并且默认的max_length是200,同EmailField

 

UUIDField
只能存储uuid格式的字符串:UUID是一个32位的全球唯一的字符串,一般用来做主键

 

 

Field的常用参数
null
1、标识是否可以为空,默认是为False。在使用字符串相关的Field(CharField/TextField/URLField/EmailField)的时候,官方推荐尽量不要使用这个参数,也就是保持默认值False。因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,如果你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来作为默认值存储进去。因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。

2、如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True。如果你的Field是BooleanField,由于BooleanField不接受null参数,因此你如果想要设置这个字段可以为空的bool类型,那么对应的可空的bool类型字段则为NullBooleanField

 

blank
标识这个字段在表单验证的时候是否可以为空,默认是False。这个和null是有区别的,null是一个纯数据库级别的。而blank是表单验证级别的

 

db_column
这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字

 

db_index
标识这个字段是否为索引字段

 

default
默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。在用函数作为值传递给default时,只能传递函数名,不需要加括号

 

primary_key
是否为主键,与AutoField/BigAutoField连用,默认是False

 

unique
在表中这个字段的值是否唯一,在数据库中就是唯一约束,一般是设置手机号码/邮箱等

 

 

模型中Meta配置
对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。示例代码如下:

class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,null=True,blank=True)

class Meta:
db_table = 'book_model'
以下将对Meta类中的一些常用配置进行解释。
1、db_table:这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型所在app的名称加上模型名的小写来作为默认的表名。

2、ordering:设置在提取数据的排序方式,因为可以按照多个字段以优先关系进行排序,所以需要传递一个字段的列表,在我们提取数据时,可以根据列表中字段从前到后(优先级从高到低)的方式排序,排序默认为正序,如果你需要哪个字段按倒序排列,就可以在这个字段前面加上"-"。后面章节会讲到如何查找数据。比如我想在查找数据的时候根据添加的时间排序,那么示例代码如下:

class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)

class Meta:
db_table = 'book_model'
ordering = ['pub_date',]

 

拓展
增加表列
在实际中,可能随着项目的开发,需要在数据库表中增加一些列:数据库表早已存在且数据库表中已存在数据。在这个情况下,我们在命令行中生成迁移脚本时,会有其他提示与操作步骤,因此需要注意下

例3:增加表列

⑴未操作前的表

⑵编辑模型类

⑶生成迁移文件

注:
1、在生成迁移文件时,未正常生成对应的文件且给出了提示

2、这句话大概是:由于数据库表中已存在数据,现在增加的列没有设置默认值且值未设置成可空,因此对于表中原来已有的数据,Django就不知道需要将它们这新增列的值设置成什么。因此我们可以按照给出的2个办法继续
您正在尝试添加一个不可为空的字段“删除”,而没有默认设置; 我们无法做到这一点(数据库需要一些东西来填充现有行)
请选择一个修复程序:
1)现在提供一次性的默认设置(将在所有现有行上设置此列的值为空)
2)退出,然后让我在models.py中添加默认值

3、当然我们还可以在新增列时添加默认值属性:remove = models.BooleanField(default=False)。只是说这种方法是针对所有的数据(已插入和未插入的)。例子中的方法是针对已插入的数据

⑷添加值并映射到数据库

⑸查询修改后的数据库表

 

Django中的时间Field配置
1、在介绍时间相关的Field之前,需要先介绍下Django中相关的时间配置

2、在Django中获取当前时间有两种方法,这里先介绍Django内置的now()方法
⑴Django内置的now()方法
⑵Python中的datetime模块下的now()方法

⑴Settings.py中的配置

⑵Django内置now()函数源码

注:
1、TIME_ZONE:表示当前时间的时区。即使用Django内置函数now()获取后的时间的时区(now()用于获取当前本机时间)。可修改
⑴对于时区的话,我们一般不会使用"UTC"时间,而是使用北京时间,因此需要将其值修改为'Asia/Shanghai'

2、USE_TZ:默认值为True
⑴值为True时,表示使用Django内置的now()方法获取的时间为一个aware类型。为True时会方便我们进行时区转换,但是这样的话存入数据库中的时间会是一个UTC时间,即使你设置了时区,也会是一个utc时间
⑵值为False时,表示使用Django内置的now()方法获取的时间为一个navie类型

3、从Django内置now()函数的源码可以看出:
⑴当"USE_TZ = True"时,就会返回一个指定了时区的时间,且时间为aware类型
⑵当"USE_TZ = False"时,就会返回一个未指定时区的时间,且时间为navie类型

例4:未修改配置前

⑴编辑模型类

⑵编辑视图

⑶访问

注:
可以看到最后的数据是与我们配置的一样的:时区为UTC,且获取的时间值类型为aware类型

 

例4_1:使用datetime模块来存入时间(未修改配置)

⑴修改配置

⑵编辑模型类:使用datetime()获取时间

⑶编辑视图

⑷查询存入的数据

注:经过自己的尝试,发现

1、只要是"USE_TZ = True",那么不管使用的是datetime还是Django内置now()函数来获取当前时间,在存入数据时都是UTC时间。即使设置了时区

2、如果不想在存入数据时存的是UTC时间,那么就需要把"USE_TZ"设置为False。所以后面我就用这个配置了USE_TZ = False以及使用datetim来获取时间了,毕竟datetime要熟悉点
————————————————
版权声明:本文为CSDN博主「不怕猫的耗子z」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zh18380113164/article/details/105232557/

发表评论

邮箱地址不会被公开。 必填项已用*标注