Django操作數(shù)據(jù)庫

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 = '天龍八部')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衣形,一起剝皮案震驚了整個濱河市驼侠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谆吴,老刑警劉巖倒源,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異句狼,居然都是意外死亡笋熬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門腻菇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胳螟,“玉大人,你說我怎么就攤上這事筹吐√撬剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵丘薛,是天一觀的道長嘉竟。 經(jīng)常有香客問我,道長洋侨,這世上最難降的妖魔是什么周拐? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凰兑,結(jié)果婚禮上妥粟,老公的妹妹穿的比我還像新娘。我一直安慰自己吏够,他們只是感情好勾给,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布滩报。 她就那樣靜靜地躺著,像睡著了一般播急。 火紅的嫁衣襯著肌膚如雪脓钾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天桩警,我揣著相機與錄音可训,去河邊找鬼。 笑死捶枢,一個胖子當(dāng)著我的面吹牛握截,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烂叔,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼谨胞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒜鸡?” 一聲冷哼從身側(cè)響起胯努,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逢防,沒想到半個月后叶沛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡忘朝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年恬汁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辜伟。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡氓侧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出导狡,到底是詐尸還是另有隱情约巷,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布旱捧,位于F島的核電站独郎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枚赡。R本人自食惡果不足惜氓癌,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贫橙。 院中可真熱鬧贪婉,春花似錦、人聲如沸卢肃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尤蒿,卻和暖如春郑气,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腰池。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工尾组, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人示弓。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓讳侨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親避乏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 本篇主要介紹我們在使用django框架開發(fā)的時候使用的操作數(shù)據(jù)庫的語句甘桑,這在動態(tài)網(wǎng)站部分是很重要的拍皮,因為我們需要連...
    EarthChen閱讀 2,667評論 0 0
  • 操作數(shù)據(jù)庫 Django配置連接數(shù)據(jù)庫: 在操作數(shù)據(jù)庫之前,首先先要連接數(shù)據(jù)庫跑杭。這里我們以配置MySQL為例來講解...
    yungege閱讀 225評論 1 0
  • Django 準(zhǔn)備 “虛擬環(huán)境為什么需要虛擬環(huán)境:到目前位置铆帽,我們所有的第三方包安裝都是直接通過 pip inst...
    33jubi閱讀 1,317評論 0 5
  • 作者:墨緣 (一) 十一放假,原本計劃是幫著父母摘蘋果德谅〉鳎回家后才發(fā)現(xiàn),今年的蘋果早已被4月初的那場倒春寒奪了去窄做,果...
    冬日的朝陽閱讀 399評論 2 9
  • 我不是高高在上的人愧驱,也不奢求云端的生活,我只想的是腳踏實地椭盏,一點點组砚,按部就班,很傳統(tǒng)掏颊,結(jié)婚生子糟红,沒有想象過舞臺中...
    天秤yue1018閱讀 221評論 0 0