1. 程式人生 > >django學習教程(二)models 模型相關

django學習教程(二)models 模型相關

版本:django2.0

開啟APP下models.py檔案

model基本建立
假設我們目前在做網站的使用者註冊模組。
我們希望這個使用者擁有如下資訊

  • 使用者名稱
  • 密碼
  • 聯絡方式
  • 郵箱
class User(models.Model):
    username = models.CharField(max_length = 50)
    password = models.CharField(max_length = 200)
    tel = models.CharField(max_length = 50,default='')
    email = models.EmailField()

    def __str__(self):
        return self.username

註冊模型並同步資料庫
在命令列進入manage.py同級目錄
依次輸入以下指令

python manage.py makemigrations
python manage.py migrate

這時開啟資料庫視覺化工具,我們便可以看到我們在該資料庫下新建了一個使用者表。

後臺新增資料庫內容
(連線資料庫通過SQL語句新增內容這種方法暫且不談)
開啟APP下的views.py檔案
新建一個方法

from log.models import User  #這裡的log改成你的APP名稱
def index(request):
    user = User()
    user.username="sd"
    user.password="a"
    user.tel="123"
    user.email="1"
    user.save()
    return render(request,'index.html')

通過user=User()在使用者表中建立一個新欄,然後加入內容,最後user.save()儲存。

model常用型別

models型別 名稱 介紹
models.AutoField 自增列 預設會生成一個名稱為 id 的列
models.CharField 字串欄位 必須有max_length 引數
models.BooleanField 布林型別 不能為空
models.DateField 日期型別
models.DateTimeField 日期型別 同DateField的引數 ,多了時間
models.EmailField 郵箱列 字串型別(正則表示式郵箱)
models.FloatField 浮點型別 =double
models.IntegerField 整形
models.BigIntegerField 長整形
models.TextField 文字型別 字串=longtext
models.ImageField 圖片型別
models.FileField 檔案型別

當使用了圖片型別或檔案型別時,modes.py下

img = models.ImageField(upload_to='xxx')

這代表著將圖片提交到xxx資料夾下。

models查詢方法

  • filter
result = User.objects.filter(username = "xxx")

從User表中查詢username="xxx"的記錄,返回的是一個列表。(可以為空)

  • get
result = User.objects.get(username = "xxx")

從User表中查詢username="xxx"的記錄。
注意:User表中必須有且只有一條符合條件的username記錄,否則報錯

  • 欄位排序
results = User.objects.all().order_by('age')
  • 模糊查詢(同樣用到的是filter)
1、包含 contains
	例:查詢姓名包含'xiao'的學生。
	Student.objects.filter(name__contains='xiao')

2、開頭:startswith  結尾:endswith
	例:查詢姓名以'xiao'開頭的學生 以'ming'結尾的學生
	Student.objects.filter(name__startswith='xiao')
	Student.objects.filter(name__endswith='ming')

3、  範圍查詢  in 
	例:查詢年齡12或15或16的學生
	Student.objects.filter(age__in=[12,15,16])

4.  比較查詢 gt lt(less than) gte(equal) lte
	例:查詢年齡大於等於12的學生
	Student.objects.filter(age__gte=12)

5、  日期查詢  date	
	例:查詢1994年出生的學生。
	Student.objects.filter(birthyear__date=1994)
	
	例:查詢1994年1月1日後出生的學生。
	Student.objects.filter(birthyear__date__gt = date(1994,1,1))

6、 返回不滿足條件的資料 exclude
	例:查詢id不為3的學生。
	Student.objects.exclude(id=3)

通過前臺提交內容到資料庫
【在templates資料夾下新建一個html檔案,並通過urls註冊路由】

通過前臺提交內容就需要用到form表格。
而這就不得不提到csrf_token驗證【django預設開啟】
(一)在csrf_token開啟情況下
前臺的form標籤需要如下書寫。

	<form method="POST">
        {% csrf_token %}
        <p>username: <input type="text" name="teacher_id"></p>
        <p>password:<input type="password" name="password"><p>
        <input type="submit" value="login">
    </form>

不新增 {% csrf_token %}就會提交出錯。

(二)關閉csrf_token驗證
開啟settings.py檔案,將這句話註釋。
在這裡插入圖片描述

前臺表單提交(以使用者註冊模組為例)
假設使用者需要註冊資訊,那麼它在前臺填寫了下面表單後,就應該把資訊新增到資料庫中
在這裡插入圖片描述

方法一 通過django自帶表單功能
在App下新建一個forms.py檔案

from django import forms
class UserInfo(forms.Form):   #定義的django表單
    username = forms.CharField()
    password = forms.CharField()

在views.py檔案下

def index(request):
    userform=UserInfo()
    if request.method=="POST":
        userform= UserInfo(request.POST)
        if userform.is_valid():
            username = userform.cleaned_data['username']
            password = userform.cleaned_data['password']
            user=User()
            user.username=username
            user.password=password
            user.save()
    return render(request,'index.html')

在index.html檔案下

	<form type="POST">
		{{userform.username}}
		{{userform.password}}
		<button type="submit">提交</button>
	</form>

這種方式比較簡便,但是佈局比較醜陋。

方法二 通過POST方法接收【推薦】
views.py檔案

def index(request):
    if request.method=="POST":
        user = User()
        user.username = request.POST.get('username','')
        user.password = request.POST.get('password','')
        user.save()
    return render(request,'index.html')

index.html檔案

	<form type="POST">
		<input type="text" name="username">
		<input type="password" name="password">
		<button type="submit">提交</button>
	</form>

通過這種方式我們便可以很容易更改input輸入框的style。