1.在最開始的項目包下的init.py中進(jìn)行如下配置
import pymysql
pymysql.install_as_MySQLdb()
2.setting.py配置文件的連接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'django',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}
3.新建模型
class User(models.Model):
name = models.CharField(max_length=30, null=False)
email = models.EmailField(max_length=50, blank=True)
username = models.CharField(max_length=30, null=False)
password = models.SlugField(max_length=20, null=False)
class Meta:
db_table = 'User'
4.執(zhí)行遷移
python3 manage.py makemigrations
python3 manage.py migrate
5.增刪改查
5.1插入數(shù)據(jù)
models.UserInfo.objects.create(user='yangmv',pwd='123456')
5.2刪除數(shù)據(jù)
models.UserInfo.objects.filter(user='yangmv').delete()
5.3改
models.UserInfo.objects.filter(user='yangmv').update(pwd='520')
5.4查
models.UserInfo.objects.all()
models.UserInfo.objects.all().values('user') #只取user列
models.UserInfo.objects.all().values_list('id','user') #取出id和user列,并生成一個列表
models.UserInfo.objects.get(id=1)
models.UserInfo.objects.get(user='yangmv')
5.6常用方法
# 獲取個數(shù)
#
models.Tb1.objects.filter(name='seven').count()
# 大于蒜危,小于
#
models.Tb1.objects.filter(id__gt=1) # 獲取id大于1的值
models.Tb1.objects.filter(id__lt=10) # 獲取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大于1 且 小于10的值
# in
#
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等于11炫刷、22、33的數(shù)據(jù)
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
# contains
#
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
models.Tb1.objects.exclude(name__icontains="ven")
# range
#
models.Tb1.objects.filter(id__range=[1, 2]) # 范圍bettwen and
# 其他類似
#
# startswith,istartswith, endswith, iendswith,
# order by
#
models.Tb1.objects.filter(name='seven').order_by('id') # asc
models.Tb1.objects.filter(name='seven').order_by('-id') # desc
# limit 、offset
#
# models.Tb1.objects.all()[10:20]
# group by
from django.db.models import Count, Min , Max , Sum
# models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
django中models的filter過濾方法
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一個list范圍內(nèi)
__startswith 以...開頭
__istartswith 以...開頭忽略大小寫
__endswith 以...結(jié)尾
__iendswith 以...結(jié)尾,忽略大小寫
__range 在...范圍內(nèi)
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
__overlap 集合至少有一個元素重合
__contains 集合包含
__regex 匹配正則表達(dá)</pre>
5.7常用字段
models.DateTimeField 日期類型 datetime
auto_now = True :則每次更新都會更新這個時間
auto_now_add 則只是第一次創(chuàng)建添加察蹲,之后的更新不再改變。
class UserInfo(models.Model):
name = models.CharField(max_length = 32 )
ctime = models.DateTimeField(auto_now = True )
uptime = models.DateTimeField(auto_now_add = True )
from web import models
def home(request):
models.UserInfo.objects.create(name = 'yangmv' )
after = models.UserInfo.objects. all ()
print after[ 0 ].ctime
return render(request, 'home/home.html' )
5.8
表結(jié)構(gòu)的修改
表結(jié)構(gòu)修改后催训,原來表中已存在的數(shù)據(jù)洽议,就會出現(xiàn)結(jié)構(gòu)混亂,makemigrations更新表的時候就會出錯
解決方法:
1漫拭、新增加的字段亚兄,設(shè)置允許為空。生成表的時候采驻,之前數(shù)據(jù)新增加的字段就會為空审胚。(null=True允許數(shù)據(jù)庫中為空,blank=True允許admin后臺中為空)
2礼旅、新增加的字段膳叨,設(shè)置一個默認(rèn)值。生成表的時候痘系,之前的數(shù)據(jù)新增加字段就會應(yīng)用這個默認(rèn)值
執(zhí)行makemigrations菲嘴, migrate 后。老數(shù)據(jù)會自動應(yīng)用新增加的規(guī)則
5.9連表結(jié)構(gòu)
一對多:models.ForeignKey(其他表)
多對多:models.ManyToManyField(其他表)
一對一:models.OneToOneField(其他表)
應(yīng)用場景:
一對多:當(dāng)一張表中創(chuàng)建一行數(shù)據(jù)時汰翠,有一個單選的下拉框(可以被重復(fù)選擇)
例如:創(chuàng)建用戶信息時候龄坪,需要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。
多對多:在某表中創(chuàng)建一行數(shù)據(jù)是复唤,有一個可以多選的下拉框
例如:創(chuàng)建用戶信息健田,需要為用戶指定多個愛好
一對一:在某表中創(chuàng)建一行數(shù)據(jù)時,有一個單選的下拉框(下拉框中的內(nèi)容被用過一次就消失了
例如:原有含10列數(shù)據(jù)的一張表保存相關(guān)信息佛纫,經(jīng)過一段時間之后妓局,10列無法滿足需求总放,需要為原來的表再添加5列數(shù)據(jù)
一對多
class Game(models.Model):
gname = models.CharField(max_length = 32 )
class Host(models.Model):
hostname = models.CharField(max_length = 32 )
game = models.ForeignKey( 'Game' )
多對多
class UserGroup(models.Model):
group_name = models.CharField(max_length = 16 )
class User(models.Model):
name = models.CharField(max_length = 16 )
sex = models.CharField(max_length = 16 )
email = models.EmailField(max_length = 32 )
usergroup_user = models.ManyToManyField( 'UserGroup' )
一對一
class User2(models.Model):
name = models.CharField(max_length = 16 )
sex = models.CharField(max_length = 16 )
email = models.EmailField(max_length = 32 )
class Admin(models.Model):
username = models.CharField(max_length = 32 )
password = models.CharField(max_length = 32 )
admin_user2 = models.OneToOneField( 'User2' )
實例
# 圖書類(一類)
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, db_column='title') # 圖書名稱
bpub_date = models.DateField() # 出版日期
bread = models.IntegerField(default=0) # 閱讀量
bcomment = models.IntegerField(default=0) # 評論量
isDelete = models.BooleanField(default=False) # 刪除標(biāo)記
# 英雄人物類(多類)
class HeroInfo(models.Model):
hname = models.CharField(max_length=20) # 英雄名
hgender = models.BooleanField(default=False) # 性別
hcomment = models.CharField(max_length=200, null=True, blank=False) # 備注
isDelete = models.BooleanField(default=False) # 刪除標(biāo)記
# 關(guān)聯(lián)屬性 (定義在多的一方)
hbook = models.ForeignKey('BookInfo') # 對應(yīng)數(shù)據(jù)庫表中的字段book_id。
# heroInfo.book是BookInfo對象; heroInfo.book_id只是BookInfo對象的id
一好爬、查詢關(guān)聯(lián)的數(shù)據(jù):
例1:查詢id為1的圖書關(guān)聯(lián)的英雄信息间聊。
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all() # 一類的對象.多類名小寫_set.all()
通過模型類直接查詢:
HeroInfo.objects.filter(hbook__id=1)
例2:查詢id為1的英雄關(guān)聯(lián)的圖書信息。
h = HeroInfo.objects.get(id=1)
h.hbook # 通過關(guān)聯(lián)屬性抵拘,返回關(guān)聯(lián)的圖書對象。
h.hbook_id # 返回關(guān)聯(lián)圖書對象的id型豁。(關(guān)聯(lián)屬性_id)
通過模型類直接查詢:
BookInfo.objects.filter(heroinfo__id = 1) # 返回QuerySet查詢集
二僵蛛、根據(jù)關(guān)聯(lián)屬性的條件查詢
通過多類的條件查詢一類的數(shù)據(jù):
一類名.objects.filter(多類名小寫多類屬性名條件名) # 關(guān)聯(lián)屬性沒有定義在該類中,所以用多類名小寫
通過一類的條件查詢多類的數(shù)據(jù):
多類名.objects.filter(關(guān)聯(lián)屬性一類屬性名條件名) # 關(guān)聯(lián)屬性定義在該類中,所以直接用關(guān)聯(lián)屬性名
例:查詢圖書信息,要求圖書關(guān)聯(lián)的英雄的描述包含'八'迎变。
BookInfo.objects.filter(heroinfo__hcomment__contains = '八')
例:查詢圖書信息充尉,要求圖書中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt = 3)
例:查詢書名為“天龍八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle = '天龍八部')