文章目录
模型常用属性
常用字段
在Django中,定义了一些Field
来写数据库表中的字段来进行映射。以下将介绍那些常用的字段类型。
AutoField
映射到数据库中的是int
类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他名字的并且具有自动增长的主键,使用AutoField
也是可以
# 必须设置为主键
id = model.AutoField(primary_key=True)
BigAutoField
64位的整形,类似于AutoField
,只不过是产生的数据的范围是从:1-9223372036854775807。
id = models.BigAutoField(primary_key=True)
BooleanField
在模型层面接收的是True
/False
。在数据库层面是tinyint
类型。
remove = models.BooleanField(null=True)
NullBooleanField
在模型层面接收的是True False or Null
。
remove = models.NullBooleanField()
CharField
在数据库层面是varchar类型。在Python层面就是普通的字符串。这个类型在使用的时候必须要指定最大的长度,也即必须要传递max_length
这个关键字参数进去。
name = models.CharField(max_length=200)
FloatField
在数据库层面是double类型,在Python层面就是浮点类型。
price = models.FloatField()
IntegerField
整形。值的区间是-2147483648-2147483647
BigIntegerField
大整形。值的区间是-9223372036854775808——9223372036854775807。
PositiveIntegerField
正整形。值的区间是0-2147483647
SmallIntegerFiel
小整形。值的区间是-32768-32767
PositiveSmallIntegerField
正小整数型。值的区间是0-32767
EmailField
类似于CharField。在数据库底层也是一个varchar类型,最大的值为254,一般用于在from表单中的邮箱判断。
TextField
大量的文本类型。映射到数据库中是longtext
。
content = models.TextField(null=True)
UUIDField
只能存储uuid格式的字符串。uuid是一个32位的全球唯一的字符串,一般用来作为主键。
FileField
用来存储文件的。
ImageField
用来存储图片文件的
URLField
类似于CharField,只不过只能用来存储url格式的字符串。并且默认的是max_length是200。
DateTimeField
日期时间类型,不仅仅可以存储日期,还可以存储时间。映射到数据库中的是datetime类型。映射到数据库中的是datetime类型。默认情况下的TIME_ZONE = 'UTC'
代表着格林威治时间。
settings.py
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
-
auto_now : 在每次这个数据保存的时候,都要使用当前的时间。
-
auto_now_add: 在每次数据第一次被添加进去的时候,都使用当前的时间。比如作为一个记录第一次入库的字段,可以将这个属性设置为True。
class Time(models.Model):
# auto_now:使用的是Django内置的时间,
# auto_now:默认情况下使用的是False
# 2020-06-30 04:21:58.549603 而为什么在数据库中显示的是这个时间
# 现在编写的时间为 2020-06-30 12:20:41.784921
# 主要的原因在项目设置里面的TIME_ZONE,
# TIME_ZONE:使用的是UTC的时间
# 把TIMe_ZONE改为Asia/Shanghai
# 把USE_TZ = False
today = models.DateTimeField(auto_now=True)
today2 = models.DateTimeField(auto_now_add=True, null=True)
Field的常用参数
null
如果设置为True,Django将会在映射表的时候指定是否为空。默认是为False。在使用字符串相关的Field的时候,官方推荐尽量不要使用这个参数,也就是保存默认值为False。
db_column
这个字段在数据库中的名字。如果没有设置这个参数,那么将会使用模型中属性的名字。相当于是给数据库中的字段重新命名。
default
默认值。可以为一个值,或者是一个函数,但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构。
primary_key
是否为主键。默认是False。
模型中的Meta配置
对应一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后再这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。
-
首先要在自己定义的模型类中定义一个相对应的嵌套类,而且这个类必须是Meta类
-
db_table : 传入一个字符串,指定映射到数据库中的表名,不使用app的名字。
-
ordering : 传入一个列表,在列表中指定相对应数据库字段的顺序,负号代表着倒序。
class ArticleDemo(models.Model):
name = models.CharField(max_length=100)
content = models.TextField()
def __str__(self):
return 'Book----name:%s,content:%s' % (self.name, self.content)
# 必须要在定义的模型内部定义一个Meta这个类,而且不能随便更改名字等
class Meta:
# db_table : 相当于就是不使用创建的app对应的名字,而是使用模型中定义的db_table对应的Book名字
db_table = 'Book'
# ordering:当传入的id为负的时候,显示的就是倒序输出
ordering = ['-id']
from django.shortcuts import render
from django.http import HttpResponse
from .models import ArticleDemo
from datetime import datetime
def index(request):
articles = ArticleDemo.objects.all()
"""
<QuerySet [<ArticleDemo: Book----name:这是第三篇文章,content:外键和表>,
<ArticleDemo: Book----name:这是第二篇文章,content:模型中的Meta配置>,
<ArticleDemo: Book----name:这是第一篇文章,content:模型的常用属性>]>
"""
print(articles)
# article.save()
return HttpResponse('这是首页')