字段類型
# 自增加
Auto = models.AutoField()
BigAuto = models.BigAutoField()
# 二進制
Binary = models.BinaryField()
# 布爾型
Boolean = models.BooleanField()
NullBoolean = models.NullBooleanField()
# 整型
PositiveSmallInteger = models.PositiveSmallIntegerField() #正整數 5個字節
SmallInteger = models.SmallIntegerField() # 整數 6個字節
PositiveInteger = models.PositiveIntegerField() # 正整數 10個字節
Integer = models.IntegerField() # 整數 11個字節
BigInteger = models.BigIntegerField() # 整數 20個字節
# 浮點型
Float = models.FloatField()
Decimal = models.DecimalField() # 指定總位數和小數位數
# 字符串
Char = models.CharField() # 指定最大長度 數據庫對應varchar
Text = models.TextField() # 不限長度 數據庫對應longtext
# 時間日期類型
Date = models.DateField()
DateTime = models.DateTimeField(
Duration = models.DurationField() # 持續時間,數據表中爲int,python中timedelta實現
# 其餘字段
Email = models.EmailField()
Image = models.ImageField()
File = models.FileField()
FilePath = models.FilePathField()
URL = models.URLField()
UUID = models.UUIDField()
GenericIPAddress = models.GenericIPAddressField() # IPv4或者IPv6
字段參數
# 共有參數
db_column #字段名
primary_key #是否爲主鍵
verbose_name #別名
unique #是否添加惟一約束
help_text #幫助信息
editable #是否可編輯
null #數據庫是否可爲空
blank #表單中是否可爲空
db_index #是否添加索引
# 特殊參數
Decimal = models.DecimalField(max_digits=4, decimal_places=2) # 總共4位,其中小數點2位 11.22 16.14
Date = models.DateField(unique_for_date=True, auto_now=True) # 日期惟一 自動更新修改日期
DateTime = models.DateTimeField(unique_for_month=True, auto_now_add=True) # 月份惟一 自動更新添加日期
Char = models.CharField(max_length=100) # 最大長度
# 關係參數
one2one = models.OneToOneField(Test, related_name='one') # related_name 用於反向查詢
"""on_delete 當一個被外鍵關聯的對象被刪除時,Django將模仿on_delete參數定義的SQL約束執行相應的操做
以下6種操做
CASCADE: 模擬SQL語言中的ON DELETE CASCADE約束,將定義有外鍵的模型對象同時刪除(該操做爲當前版本Django-1.11默認操做)
PROTECT: 阻止上面的刪除操做,可是彈出ProtectedError異常
SET_NULL: 將外鍵字段設爲null,只有當字段設置了null=True時,方可以使用
SET_DEFAULT: 將外鍵字段設爲默認值,只有當字段設置了default參數時,方可以使用
DO_NOTHING: 什麼也不作
SET(): 設置爲一個傳遞給SET()的值或者一個回調函數的返回值,注意大小寫
"""
foreign1 = models.ForeignKey(A, on_delete=models.CASCADE)
foreign2 = models.ForeignKey(A, on_delete=models.PROTECT)
foreign3 = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True)
foreign4 = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0)
foreign5 = models.ForeignKey(A, on_delete=models.DO_NOTHING)
foreign6 = models.ForeignKey(A, on_delete=models.SET)
元數據
# Model類中自帶一個Meta子類用於定義模型元數據,元數據主要對數據表進行定義
db_table = 'address' # 表名稱
ordering = ['pid'] # 排序
verbose_name = '省市縣地址信息' # 數據表別名
verbose_name_plural = verbose_name # 複數別名
abstract = True # 只用於繼承而不生成數據表
permissions = (('定義好的權限', '權限說明'),)
class Task(models.Model):
class Meta:
#自定義權限
permissions = (
("view_task", "Can see available tasks"),
("change_task_status", "Can change the status of tasks"),
("close_task", "Can remove a task by setting its status as closed"),
)
#用戶檢查自定義權限
user.has_perm('app.view_task')
managed = False # 是否歸入管理,False則不會生成表
unique_together = ('address', 'note') # 聯合惟一鍵
app_label = 'courses' # INSTALLED_APPS中若是沒有添加courses應用,這裏須要指定
db_tablespace # 定義數據庫表空間的名字
查詢接口
Teacher.objects.all()
Teacher.objects.get(nickname='Jack')
Teacher.objects.filter(fans__gte=500)
Teacher.objects.filter(fans__in=[666,123]) # 在列表內
Teacher.objects.filter(nickname__icontains='A') icontains # 大小寫不敏感
Teacher.objects.all()[:1] # 切片
Teacher.objects.all().order_by('-fans') # 排序
Teacher.objects.filter(fans__gte=500).order_by('nickname') # 鏈式查詢
str(Teacher.objects.filter(fans__gte=500).order_by('nickname').query) # 查看原生SQL
Student.objects.all().exclude(nickname='A同窗') # 排除
Student.objects.all().reverse() 反向排序 # models的Meta中須要添加ordering
Student.objects.all().distinct() # 去重
Student.objects.all().extra(select={'name': 'nickname'}) # 取別名
Student.objects.all().defer() # 排除某些字段
Student.objects.all().only() # 只獲取某些字段
Student.objects.all().values('nickname', 'hobby') # 獲取字典形式的QuerySet 分組
Student.objects.all().values_list('nickname', 'hobby') # 獲取元組形式的QuerySet 分組
Student.objects.all().values_list('nickname', flat=True) # 當只有一個字段時,flat=True能夠將元組中的值直接放入列表中
Student.objects.dates('created_at', 'month', order='DESC') # 根據時期獲取查詢集
Student.objects.datetimes('created_at', 'month', order='DESC') # 根據時期獲取查詢集
p_240 = Course.objects.filter(price__gte=240)
p_260 = Course.objects.filter(price__lte=260)
p_240.union(p_260) # 並集 innodb只支持並集
p_240.intersection(p_260) # 交集
p_240.difference(p_260) # 差集
courses = Course.objects.all().select_related('teacher') # 一對一 多對一查詢優化
students = Student.objects.all().prefetch_related('course') # 一對多 多對多查詢優化
Teacher.objects.get(nick='Jack').course_set.all() # 反向查詢
Course.objects.values('teacher').annotate(vol=Sum('volume')) # 聚合計數
Course.objects.values('teacher').annotate(pri=Avg('price')) # 聚合計數
get_or_create()
Course.objects.first()
Course.objects.last()
Course.objects.earliest() # Meta中添加get_latest_by
Course.objects.latest() # Meta中添加get_latest_by
Course.objects.in_bulk(['課程1', '課程2'])
create()
bulk_create()
update_or_create()
update()
Course.objects.filter(title='test').delete()
Course.objects.filter(title='test').exists()
Course.objects.count()
Course.objects.aggregate(Max('price'),Min('price'), Avg('price'), Sum('volume'))
#F對象和Q對象
#F對象:操做字段的數據
Course.objects.update(price=F('price') - 11)
Course.objects.filter(volume__lte=F('price')*10)
#Q對象:結合AND,OR,NOT,|,~,&實現複雜的查詢
Course.objects.filter(Q(title__icontains='java') & Q(volume__gte=5000))