1. 程式人生 > >Django框架——模型(數據庫操作)

Django框架——模型(數據庫操作)

models py

-- models.py

-- ORM(object-relation mapping) 實現數據模型與數據庫的解耦;

# 對象,關系,映射;

1.根 據對象的類型生成表結構;

2.將對象、列表的操作,轉換為sql語句;

3.將sql查詢到的結果轉換為對象、列表;


-- 字段類型

# 所有字段類型被定義在django.db.models.fields目錄下,

# 方便使用,被導入到django.db.models中;

1.AutoField 自動增長 # 通常不用指定

2.BooleanField 布爾類型

3.NullBooleanField 支持布爾值與null

4.CharField(max_length=長度) 字符串 # 必須指定最大長度

5.TextFeild 大文本字段

6.IntegerField 整數

7.DecimalField(max_digits=None,decimal_places=None) # 浮點數,總位數,小數位數

8.DateField([auto_now=False, auto_now_add=False]) # 保存對象時間;創建對象時間;

9.TimeField 時間 # 同DateField

10.DateTimeField 日期時間 # 同DateField

11.FileField 上傳文件時間

12.ImageField # 繼承與FileField,對上傳內容進行校驗

13.BigIntegerField 64位整數

14.SmallIntegerField

-- 字段命名限制

1.非python保留字

2.不能有連續下劃線,查詢中有;


-- 字段選項(數據庫中的約束)

1.null

2.blank

3.db_column # 自定義字段名

4.db_index

5.default

6.primary_key

7.unique


-- 關系字段類型

1.ForeignKey 一對多

manufacturer.car_set.all()

2.OneToOneField 一對一

3.ManyToManyField 多對多


-- 元選項

# 創建模型類之後自定義表名
class Meta:
‘‘‘自定義表名‘‘‘
db_table = ‘bookinfo‘
# 在生成遷移之後的0001——initial.py文件中多處一個;
# option={
‘db_table‘:‘bookinfo‘ 
# 表示表的名字已經被自定義了;
# 默認生成的表的名字是:應用名_小寫的模型類名;
# 如:booktest_heroinfo;
}
# 表示當前不是模型類,模型不會被用來創建所有數據表
class Meta:
‘‘‘表示當前類不是模型類,而是其他模型的抽象基類‘‘‘
abstract = True
# 繼承模型類,調用其方法

-- 測試數據

# class BookInfo(models.Model):
# btitle = models.CharField(max_length=20)
# bpub_date = models.DateTimeField()
# bread = models.IntegerField(default=0)
# bcomment = models.IntegerField(default=0)
# isDelete = models.BooleanField(default=False)
# class Meta:
# db_table = ‘bookinfo‘
# class HeroInfo(models.Model):
# hname = models.CharField(max_length=20)
# hgender = models.BooleanField(default=True)
# isDelete = models.BooleanField(default=False)
# hcontent = models.CharField(max_length=100)
# hbook = models.ForeignKey(‘BookInfo‘)
# insert into bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
# (‘射雕英雄傳‘,‘1980-5-1‘,12,34,0),
# (‘天龍八部‘,‘1986-7-24‘,36,40,0),
# (‘笑傲江湖‘,‘1995-12-24‘,20,80,0),
# (‘雪山飛狐‘,‘1987-11-11‘,58,24,0);
# insert into model_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values
# (‘郭靖‘,1,1,‘降龍十八掌‘,0),
# (‘黃蓉‘,0,1,‘打狗棍法‘,0),
# (‘黃藥師‘,1,1,‘彈指神通‘,0),
# (‘歐陽鋒‘,1,1,‘蛤蟆功‘,0),
# (‘梅超風‘,0,1,‘九陰白骨爪‘,0),
# (‘喬峰‘,1,2,‘降龍十八掌‘,0),
# (‘段譽‘,1,2,‘六脈神劍‘,0),
# (‘虛竹‘,1,2,‘天山六陽掌‘,0),
# (‘王語嫣‘,0,2,‘神仙姐姐‘,0),
# (‘令狐沖‘,1,3,‘獨孤九劍‘,0),
# (‘任盈盈‘,0,3,‘彈琴‘,0),
# (‘嶽不群‘,1,3,‘華山劍法‘,0),
# (‘東方不敗‘,0,3,‘葵花寶典‘,0),
# (‘胡斐‘,1,4,‘胡家刀法‘,0),
# (‘苗若蘭‘,0,4,‘黃衣‘,0),
# (‘程靈素‘,0,4,‘醫術‘,0),
# (‘袁紫衣‘,0,4,‘六合拳‘,0);


-- 模型類方法

1.str方法
# 返回模型類對象的描述
2.save方法
# 將對象保存至數據庫
3.delete方法
# 級聯刪除  
user=models.ForeignKey(user,blank=True,null=True,on_delete=models.SET_NULL)
# 沒看懂


-- 管理器(模型的成員)

# 模型類的屬性,將對象與數據表映射;

-- 類的屬性

# objects是Manager類型的對象,django中定義好的類,用於數據庫的交互;
# 如果沒有指定,默認提供一個管理器objects;


-- 修改管理器名稱(默認objects)

# models.py文件中
from django.db import models
class Person(models.Model):
# 這個模型類裏面有一個屬性叫做person
person = models.Mangager()
# 在Manager()類中完成字段信息的映射;


-- 自定義管理器

# 默認管理器方法太少,可以通過自定義管理器來新增方法;

-- 修改管理器返回的原始查詢集

class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
# 修改父類Manager中的get_queryset()方法,在父類方法後面添加一個filter(isDelete=Fales);
# super(BookInfoManager, self).get_queryset()表示父類的方法;
class BookInfo(models.Model):
... 字段賦值
books1 = BookInfoManger()  # 表示重寫父類後,重新定義給新的管理器;


-- 向管理器類中添加額外的方法

# 模型類中無法再使用__init__方法,因為父類已經使用創建了很多東西;
# 所以,我們通過在模型類中使用類方法;
@classmethod
def create(cls, btitle, bpub_date):
b = BookInfo
b.btitle = btitle
...
return b
或者:
在自定義管理器中添加上面的方法;(推薦使用)


-- 查詢

-- 獲取所有對象

object1 = 表名.objects.all()
# bookinfo = BookInfo.objects.all()
# 可以通過切片選擇範圍內對象(限制查詢集合)
object2 = 表名.objects.all()[1,3]


-- 過濾器(查詢集的方法)

-- 條件查詢

1.filter() # 滿足查詢,始終返回一個查詢集,列表
2.exclude() # 不滿足查詢
3.order_by()
4.values()  
5.all()

-- 語法規則:

# 表名.objects.filter(字段名__運算符判斷=‘值‘)

-- 運算符

1.exact  # 精確匹配
2.contains  # 包含
3.startswith  # 以指定值開頭
4.endswith  # 以指定值結束
5.isnull  # 不為空
6.in  # 範圍內查詢
7.gt/gte/lt/lte
# 運算符前加上i,不區分大小寫;

-- 例子

# filter()過濾器
# 精確查詢
bookinfo_3 = BookInfo.objects.filter(id__exact=1)
print(bookinfo_3)
# 包含查詢
bookinfo4 = BookInfo.objects.filter(book_title__contains=‘八‘)
print(bookinfo4)
# 首字查詢
bookinfo5 = BookInfo.objects.filter(book_title__startswith=‘天‘)
print(bookinfo5)
# 尾字查詢
bookinfo6 = BookInfo.objects.filter(book_title__endswith=‘傳‘)
print(bookinfo6)
# 查看不為空的字段值
bookinfo7 = BookInfo.objects.filter(book_title__isnull=False)
print(bookinfo7)
# 查詢指定編號範圍的字段值
bookinfo8 = BookInfo.objects.filter(pk__in=[1,3])
print(bookinfo8)
# 查詢大小範圍內的字段值
bookinfo9 = BookInfo.objects.filter(id__gt=3)
print(bookinfo9)
# exclude()過濾器
bookinfo10 = BookInfo.objects.exclude(id__gt=3)
print(bookinfo10)


-- 返回單個值的方法

-- get 獲取單一對象

bookinfo11 = BookInfo.objects.get(book_title = ‘天龍八部‘)
print(bookinfo11)
# get如果查詢的不僅一個對象,會觸發MultipleObjectsReturned異常
bookinfo12 = BookInfo.objects.get(id__gt=2)
print(bookinfo12)
# get如果查詢不到對象,會觸發DoesNotExist異常
bookinfo13 = BookInfo.objects.get(book_title = ‘天龍七部‘)
print(bookinfo13)
-- count()
-- first()
-- last()
-- exists()


-- F對象和Q對象

# 需要導入模塊中的對象

from django.db.models import F, Q


-- F對象

# 實現兩個屬性之間的比較
bookinfo14 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘))
print(bookinfo14)
# 可以在F()對象上使用算數運算
bookinfo15 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)*2)
print(bookinfo15)


-- Q對象(query查詢)

# 構造查詢對象
-- 邏輯與:多個過濾器逐個調用
bookinfo16 = BookInfo.objects.filter(book_read__lte=40, id__lte=3)
print(bookinfo16)
bookinfo17 = BookInfo.objects.filter(book_read__lte=40).filter(id__lte=3)
print(bookinfo17)
-- 利用Q對象實現,或與非
-- 基本語法
Q(屬性名__運算符=值)
# &表示邏輯與,|表示邏輯或
bookinfo18 = BookInfo.objects.filter(Q(book_read__lte=40) & Q(id__lte=3))
print(bookinfo18)
bookinfo19 = BookInfo.objects.filter(Q(book_read__lte=40) | Q(id__lte=3))
print(bookinfo19)


-- 聚合函數

# 需要導入模塊
from django.db.models import *
表名.objects.aggregate(Sum(字段名))
1.Avg
2.Count
# 查詢總數的時候一般不使用;
# BookInfo.objects.count() 替代;
3.Max
4.Min
5.Sum
bookinfo20 = BookInfo.objects.aggregate(Sum(‘book_read‘))
print(bookinfo20)


-- 關聯查詢

-- 一對多,一類

1.獲取單一字段對象
object1 = 表名.objects.get(‘條件‘)
# book = BookInfo.objects.get(id=1)
2.獲取對應所有所有對象信息
object2 = object1.小寫表名_set.all()
# heroes = book.heroinfo_set.all()

-- 多對一,多類

1.獲取單一字段對象
object1 = 表名.objects.get(‘條件‘)
# hero = HeroInfo.objects.get(id=1)
2.獲取對應對象信息
object1.字段屬性
# hero.hero_book

-- 通過模型類實現關聯查詢

# 暫略


-- 自關聯

# 略


Django框架——模型(數據庫操作)