天天看點

Django架構學習7--models

django與使用者進行互動,頁面一旦關閉,或伺服器重新開機,一切都将回到原始狀态。

是以需要使用資料庫對使用者操作資料進行儲存,Django通過自帶的ORM架構操作資料庫,并且原生支援輕量級的sqlite3資料庫。

1.django使用mysql配置

需要安裝安裝資料庫驅動mysqlclient

pip install mysqlclient
           

如果使用其他資料庫,需要自己進行settings.py中進行配置。mysql的配置如下:

# DATABASES = {
# #     'default': {
# #         'ENGINE': 'django.db.backends.sqlite3',
# #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# #     }
# # }
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',#資料庫引擎
        'NAME': 'django_test',#資料庫名稱,需要自己手動建立,django不會主動為你建立
        'USER': 'root',       #資料庫使用者名
        'PASSWORD': 'talent', #資料庫密碼
        'HOST':'localhost',   #資料庫主機ip位址
        'PORT':'3306',        #mysql使用的端口号
    }
}
           

2.django與mysql互動

(1)建立資料庫的表類,類名代表了資料庫表名,且繼承了models.Model,類裡面的字段代表資料表中的字段

(2)對資料庫表進行同步操作,python manage.py makemigrations,python manage.py migrate

(3)使用資料庫表類,進行資料庫的增删改查操作。

3.字段類型-參數詳解

django的models裡面字段類型除了上面的常用的 models.CharField和models.IntegerField,還有更多的類型

1、models.AutoField  自增列= int(11)

  如果沒有的話,預設會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須将給列設定為主鍵 primary_key=True。

2、models.CharField  字元串字段

  必須 max_length 參數

3、models.BooleanField  布爾類型=tinyint(1)

  不能為空,Blank=True

4、models.ComaSeparatedIntegerField  用逗号分割的數字=varchar

  繼承CharField,是以必須 max_lenght 參數

5、models.DateField  日期類型 date

  對于參數,auto_now =True則每次更新都會更新這個時間;auto_now_add 則隻是第一次建立添加,之後的更新不再改變。

6、models.DateTimeField  日期類型 datetime

  同DateField的參數

7、models.Decimal  十進制小數類型= decimal

  必須指定整數位max_digits和小數位decimal_places

8、models.EmailField  字元串類型(正規表達式郵箱)=varchar

  對字元串進行正規表達式

9、models.FloatField  浮點類型= double

10、models.IntegerField  整形

11、models.BigIntegerField  長整形

  integer_field_ranges ={

    'SmallIntegerField':(-32768,32767),

    'IntegerField':(-2147483648,2147483647),

    'BigIntegerField':(-9223372036854775808,9223372036854775807),

    'PositiveSmallIntegerField':(0,32767),

    'PositiveIntegerField':(0,2147483647),

  }

12、models.IPAddressField  字元串類型(ip4正規表達式)

13、models.GenericIPAddressField  字元串類型(ip4和ip6是可選的)

  參數protocol可以是:both、ipv4、ipv6

  驗證時,會根據設定報錯

14、models.NullBooleanField  允許為空的布爾類型

15、models.PositiveIntegerFiel  正Integer

16、models.PositiveSmallIntegerField  正smallInteger

17、models.SlugField  減号、下劃線、字母、數字

18、models.SmallIntegerField  數字

  資料庫中的字段有:tinyint、smallint、int、bigint

19、models.TextField  字元串=longtext

20、models.TimeField  時間 HH:MM[:ss[.uuuuuu]]

21、models.URLField  字元串,位址正規表達式

22、models.BinaryField  二進制

23、models.ImageField圖檔

24、models.FilePathField檔案

對應的字段參數如下:

1、null=True

  資料庫中字段是否可以為空

2、blank=True

  django的 Admin 中添加資料時是否可允許空值

3、primary_key = False

  主鍵,對AutoField設定主鍵後,就會代替原來的自增 id 列

4、auto_now 和 auto_now_add

  auto_now 自動建立---無論添加或修改,都是目前操作的時間

  auto_now_add 自動建立---永遠是建立時的時間

5、choices

GENDER_CHOICE = (

(u'M', u'Male'),

(u'F', u'Female'),

)

gender = models.CharField(max_length=2,choices = GENDER_CHOICE)

6、max_length

7、default  預設值

8、verbose_name  Admin中字段的顯示名稱

9、name|db_column  資料庫中的字段名稱

10、unique=True  不允許重複

11、db_index = True  資料庫索引

12、editable=True  在Admin裡是否可編輯

13、error_messages=None  錯誤提示

14、auto_created=False  自動建立

15、help_text  在Admin中提示幫助資訊

16、validators=[]

17、upload-to

4.實際使用

建立資料庫表類,執行同步操作後,可以從資料庫表中看到表新增成功了,預設多一個字段id為主鍵

如果要使用某個字段作為主鍵,隻需要增加字段參數primary_key =True

1.新增hero資料表類

class Hero(models.Model):
    name = models.CharField(max_length=30)
    propertys = models.CharField(max_length=30)
    is_male = models.BooleanField(null=False)
    power = models.IntegerField(default=1)
           

2.添加url規則

url(r'hero',views.hero),
           

3.templates檔案hero.html

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>Hero頁面</title>
</head>
<body>
<h1>使用者輸入:</h1>
<form action="/hero/" method="post">
    英雄 名:<input type="text" name="name"/><br/>
    英雄屬性:<input type="text" name="propertys"/><br/>
    是否男性:<input type="text" name="is_male"/><br/>
    武力 值:<input type="text" name="power"/><br/>
    <input type="submit" value="送出"/>
</form>

<h1>英雄展示:</h1>
<table >
    <thead>

    <tr>英雄名</tr>
    <tr>英雄屬性</tr>
    <tr>是否男性</tr>
    <tr>武力值</tr>
    </thead>
    <tbody>
    {% for item in data %}
    <tr>
        <td>{{ item.name }}</td>
        <td>{{ item.propertys }}</td>
        <td>{{ item.is_male}}</td>
        <td>{{ item.power }}</td>
    </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>
           

4.視圖函數:

def hero(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        propertys = request.POST.get('propertys')
        is_male = request.POST.get('is_male')
        power = request.POST.get('power')
        print(name, propertys, is_male, power, type(name))
        hero = Hero(name=name, propertys=propertys, is_male=is_male, power=power)
        hero.save()
    data = Hero.objects.all()
    return render_to_response('hero.html', {'data': data})
           

實作效果:通路http://127.0.0.1:8000/hero/,

如果資料庫中有資料就從,資料庫中取出全部資料,展示在下方table中,上方可以通過表單送出方式,不斷向資料庫中送出資料

Django架構學習7--models

1.新增資料方法

建立資料表執行個體,如

hero = Hero(name=name, propertys=propertys, is_male=is_male, power=power),調用hero.save()方法
           

注意:建立執行個體時參數必須寫成關鍵字參數形式,不可寫成hero = Hero(name,propertys,is_male,power)形式,django會解析錯誤

2.删除資料

Django架構學習7--models
def delete_data(request):
    #根據屬性擷取資料,調用delete()方法删除
    # hero1 = Hero.objects.get(name = '2')
    # hero1.delete()
    Hero.objects.filter(id=12).delete()
    # Hero.objects.all().delete()#删除所有資料
    return HttpResponse("删除資料成功!!")
           

3.修改資料

def update_data(request):
    # 1.根據屬性查詢到資料後,對屬性進行修改,然後調用save方法儲存
    hero = Hero.objects.get(name='提莫')
    hero.power = 100
    hero.save()
    # 2.根據屬性查詢到資料後,直接調用update()方法
    Hero.objects.filter(name="德瑪").update(name='諾克薩斯')
    # 3.調用all方法的update方法
    Hero.objects.all().update(is_male=False)
    return HttpResponse("修改成功")
           
Django架構學習7--models

4.查詢資料

def qury_data(request):
    # get方法查詢可以傳遞多個參數進行限制,查詢結果隻能是一個,限制條件如果不唯一,會報錯
    hero = Hero.objects.get(name='提莫')#傳回是一個執行個體對象,<class 'hello.models.Hero'>
    print(type(hero))
    power_qury = Hero.objects.filter(name='德瑪', is_male=False)#根據條件過濾,可傳回多個
    print(type(power_qury))#<class 'django.db.models.query.QuerySet'>
    power = power_qury[0].power
    all_hero = Hero.objects.all()#查詢所有
    for i in all_hero:
        print(i.name)
    order_by = Hero.objects.order_by("name")
    for i in order_by:
        print(i.name)
    #查詢結果可以進行切片操作Hero.objects.order_by("name")[0:2],相當于limit 2
    return HttpResponse("<h1>%s</h1>" % power)
           
Django架構學習7--models

5.查詢方法詳解

查詢方法有很多,根據傳回結果分類

  • 傳回對象是對象清單的: all(), filter(), exclude(), order_by(), reverse(), values(), values_list(), distinct()
  • 傳回結果是對象: get(), first(), last()
  • 傳回結果是布爾值: exists()
  • 傳回數字: count()

傳回對象清單即queryset序列,可以通過for循環進行擷取每一個對象,然後使用對象調用對應的屬性。也可以通過下标取某個對象,然後調用對應的屬性。使用切片操作也可以擷取其中某幾個對象。

傳回對象的可以直接調用對應的屬性和方法。

values函數,可以由queryset序列調用values函數,傳回值是一個字典

result=Hero.objects.all().values("name","power")
    for r in result:
        print(r)

傳回結果:

{'name': '諾克薩斯', 'power': 10}
{'name': '劍聖', 'power': 20}
{'name': '諾克薩斯', 'power': 20}
{'name': '提莫', 'power': 100}
           

exclude() 它包含了與所給篩選條件不比對的對象 調用者:objects管理器 傳回queryset

result2 = Hero.objects.exclude(name = "諾克薩斯")
    for r in result2:
        print(r.name)
傳回的是name不等于諾克薩斯的對象集合
劍聖
提莫
           

order_by() 對查詢結果排序 由queryset對象調用,傳回值是queryset,預設升序,前面加個-是代表降序

ret=Hero.objects.all().order_by("-power")
根據power值降序排列
           

reverse() 對查詢結果反向排序 由queryset對象調用,傳回值是queryset

ret=Hero.objects.all().order_by("-power").reverse()
           

values_list() 由queryset對象調用, 傳回值是queryset 一個元組序列

ret=Hero.objects.all().values_list("name", "power")
           

distinct() 從傳回結果中剔除重複紀錄 由queryset對象調用,傳回值是queryset

ret=Hero.objects.all().values("name", "power").distinct()
           

first(),last()方法: 傳回第一條記錄和傳回最後一條記錄 調用者:queryset 傳回model對象

fir = Hero.objects.all().order_by("name").first()
           

exists() 如果QuerySet包含資料,就傳回True,否則傳回False 由queryset對象調用 傳回值布爾值

is_exist=Hero.objects.all().exists()
           

count : 數數 由queryset對象調用 傳回int

et=Hero.objects.all().count()