在虛擬環境中安裝mysql包html
pip install mysql-pythonpython
在mysql中建立數據庫mysql
create databases test charset=utf8git
打開settings.py文件,修改DATABASES項sql
DATABASES = {
'default': {數據庫'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': '用戶名', 'PASSWORD': '密碼', 'HOST': '數據庫服務器ip,本地可使用localhost', 'PORT': '端口,默認爲3306',複製代碼
}
}django
對於重要數據都作邏輯刪除,不作物理刪除,實現方法是定義isDelete屬性,類型爲BooleanField,默認值爲False緩存
TimeField:使用Python的datetime.time實例表示的時間,參數同DateFieldbash
mytestinfo.testinfo_set.all()服務器
用一訪問一:對象.模型類小寫
testinfo.mytestinfo
訪問id:對象.屬性_id
testinfo.mytest_id
元信息db_table:定義數據表名稱,推薦使用小寫字母,數據表的默認名稱
<應用名稱>_<模型類名稱>
ordering:對象的默認排序字段,獲取對象的列表時使用,接收屬性構成的列表
class TestInfo(models.Model):
class Meta(): ordering = ['id']複製代碼
字符串前加-表示倒序,不加-表示正序
class TestInfo(models.Model):
class Meta():ordering = ['-id']複製代碼
支持明確指定模型類的管理器
class BookInfo(models.Model):
books = models.Manager()
當爲模型類指定管理器後,django再也不爲模型類生成名爲objects的默認管理器
管理器是Django的模型進行數據庫的查詢操做的接口,Django應用的每一個模型都擁有至少一個管理器
自定義管理器類主要用於兩種狀況
向管理器類中添加額外的方法建立管理器對象保存數據到數據庫
class TestInfoManager(models.Manager):
def create_test(self, title, update):
test = self.model()
test.isDelete = False
return testclass TestInfo(models.Model):
tests = TestInfoManager()
方法調用:book=TestInfo. tests.create_ test("abc",datetime(1980,1,1))
保存:test.save()
修改管理器返回的原始查詢集:重寫get_queryset()方法
class TestInfoManager(models.Manager):
def get_queryset(self):
return super(TestInfoManager, self).get_queryset().filter(isDelete=False)
class TestInfo(models.Model):
tests = TestInfoManager()
當建立對象時,django不會對數據庫進行讀寫操做
在模型類中增長一個類方法保存數據到數據庫
class BookInfo(models.Model):
@classmethod
def create(cls, title):test = cls(btitle=title) test.isDelete = False return test複製代碼
引入時間包:from datetime import *
調用:test=TestInfo.create("hello");
保存:test.save()
DoesNotExist:在進行單個查詢時,模型的對象不存在時會引起此異常,結合try/except使用
返回查詢集的方法,稱爲過濾器,管理器對象方法有all()、filter()、exclude()、order_by()、values()
返回單個值的方法
模型查詢集的緩存
這構成了兩個查詢集,沒法重用緩存,每次查詢都會與數據庫進行一次交互,增長了數據庫的負載
print([e.title for e in Entry.objects.all()])
print([e.title for e in Entry.objects.all()])
querylist=Entry.objects.all()
print([e.title for e in querylist])
print([e.title for e in querylist])
什麼時候查詢集不會被緩存:當只對查詢集的部分進行求值時會檢查緩存,可是若是這部分不在緩存中,那麼接下來查詢返回的記錄將不會被緩存,這意味着使用索引來限制查詢集將不會填充緩存,若是這部分數據已經被緩存,則直接使用緩存中的數據
比較運算符:表示兩個下劃線,左側是屬性名稱,右側是比較類型
exact:表示判等,大小寫敏感;若是沒有寫「 比較運算符」,表示判等
filter(isDelete=False)
contains:是否包含,大小寫敏感
exclude(btitle__contains='傳')
startswith、endswith:以value開頭或結尾,大小寫敏感
exclude(btitle__endswith='傳')
isnull、isnotnull:是否爲null
filter(btitle__isnull=False)
在前面加個i表示不區分大小寫,如iexact、icontains、istarswith、iendswith
in:是否包含在範圍內
filter(pk__in=[1, 2, 3, 4, 5])
gt、gte、lt、lte:大於、大於等於、小於、小於等於
filter(id__gt=3)
year、month、day、week_day、hour、minute、second:對日期間類型的屬性進行運算
filter(bpub_dateyear=1980)
filter(bpub_dategt=date(1980, 12, 31))
跨關聯關係的查詢:處理join查詢
語法:模型類名 <屬性名> <比較>
注:能夠沒有<比較>部分,表示等於,結果同inner join
可返向使用,即在關聯的兩個模型中均可以使用
filter(heroinfohcontent__contains='八')
查詢的快捷方式:pk,pk表示primary key,默認的主鍵是id
filter(pk__lt=6)
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
count = list.count()
可使用模型的字段A與字段B進行比較,若是A寫在了等號的左邊,則B出如今等號的右邊,須要經過F對象構造
list.filter(read__gte=F('commet'))
django支持對F()對象使用算數運算
list.filter(read__gte=F('commet') * 2)
F()對象中還能夠寫做「模型類__列名」進行關聯查詢
list.filter(isDelete=F('testinfo__isDelete'))
對於date/time字段,可與timedelta()進行運算
list.filter(update__lt=F('update') + timedelta(days=1))
Q對象(django.db.models.Q)用於封裝一組關鍵字參數,這些關鍵字參數與「比較運算符」中的相同
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
Q對象可使用&(and)、|(or)操做符組合起來
當操做符應用在兩個Q對象時,會產生一個新的Q對象
list.filter(pk_ lt=6).filter(bcommet gt=10)
list.filter(Q(pk lt=6) | Q(bcommet _gt=10))
使用~(not)操做符在Q對象前表示取反
list.filter(~Q(pk__lt=6))
可使用&|~結合括號進行分組,構造作生意複雜的Q對象
class AreaInfo(models.Model): atitle = models.CharField(max_length=20) aParent = models.ForeignKey('self', null=True, blank=True)