文章目錄
模型常用屬性
常用字段
在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('這是首頁')