一、ORM
映射關系
表名 <-------> 類名 字段 <-------> 屬性 表記錄 <------->類實例對象
二、創建表(建立模型)
在創建表之前的准備工作:
第一步:在創建表之前,首先應該在mysql中創建一個數據庫。
第二步:在setting配置文件中進行數據庫連接的相關配置。
即# 修改django默認的數據庫的sqlite3為mysql
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #通過這個去鏈接mysql 'NAME': 'bookadmin', #自己創建的數據庫名 'USER':'root', 'PASSWORD':'123', 'HOST':'localhost', 'PORT':'3306', } }
第三步:在app01--init文件中導入pymysql,再寫上這一句 pymysql.install_as_MySQLdb()
第四步:創建數據庫表的執行命令(需要記住的兩條命令)
python manage.py makemigrations 創建腳本
python manage.py migrate 遷移
我們基於圖書管理系統,做一個增刪改查的功能
首先,先在modle模塊中創建一張Book表,具體代碼如下。
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2)
字段選項
每個字段有一些特有的參數,例如,CharField需要max_length參數來指定VARCHAR
數據庫字段的大小。還有一些適用於所有字段的通用參數。 這些參數在文檔中有詳細定義,這里我們只簡單介紹一些最常用的:

(1)null 如果為True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False. (1)blank 如果為True,該字段允許不填。默認為False。 要注意,這與 null 不同。null純粹是數據庫范疇的,而 blank 是數據驗證范疇的。 如果一個字段的blank=True,表單的驗證將允許該字段是空值。如果字段的blank=False,該字段就是必填的。 (2)default 字段的默認值。可以是一個值或者可調用對象。如果可調用 ,每有新對象被創建它都會被調用。 (3)primary_key 如果為True,那么這個字段就是模型的主鍵。如果你沒有指定任何一個字段的primary_key=True, Django 就會自動添加一個IntegerField字段做為主鍵,所以除非你想覆蓋默認的主鍵行為, 否則沒必要設置任何一個字段的primary_key=True。 (4)unique 如果該值設置為 True, 這個數據字段的值在整張表中必須是唯一的 (5)choices 由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 如果設置了choices ,默認的表單將是一個選擇框而不是標准的文本框,而且這個選擇框的選項就是choices 中的選項。 這是一個關於 choices 列表的例子: YEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ('GR', 'Graduate'), ) 每個元組中的第一個元素,是存儲在數據庫中的值;第二個元素是在管理界面或 ModelChoiceField 中用作顯示的內容。 在一個給定的 model 類的實例中,想得到某個 choices 字段的顯示值,就調用 get_FOO_display 方法(這里的 FOO 就是 choices 字段的名稱 )。例如: from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES) >>> p = Person(name="Fred Flintstone", shirt_size="L") >>> p.save() >>> p.shirt_size 'L' >>> p.get_shirt_size_display() 'Large'
三、添加表記錄
添加表記錄的方式有如下兩種:
方式1
book_obj=models.Book(title=title,author=author,publishDate=pubDate,price=price)
book_obj.save()
方式二
book_obj=models.Book.objects.create(title=title,publishDate=publishDate,price=price)
四、查看表記錄
1、先在視圖函數view中將數據取出來
from app01 import models #app01是應用名 def index(request): # 從數據庫取出所有書籍對象 bookList=models.Book.objects.all() # [bookObj1,.....] return render(request,"index.html",{"bookList":bookList})
查詢相關
<1> all(): 查詢所有結果
<2> filter(): 查詢所給篩選條件相匹配的對象
2、在template模版中接收
{% for book_obj in bookList %} <tr> <td>{{ book_obj.nid }}</td> <td>{{ book_obj.title }}</td> <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td> <td>{{ book_obj.price }}</td> </tr> {% endfor %}
五、查詢表記錄
1.與查詢相關的API
<1> all(): 查詢所有結果 <2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象,即過濾 <3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個, 如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。拿到的是一個model對象,區別於filter <5> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象,即除過篩選對象外的所有記錄 <4> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的並不是一系列 model的實例化對象,而是一個可迭代的字典序列 <9> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 <6> order_by(*field): 對查詢結果排序 <7> reverse(): 對查詢結果反向排序 <8> distinct(): 從返回結果中剔除重復紀錄 <10> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。 <11> first(): 返回第一條記錄 <12> last(): 返回最后一條記錄 <13> exists(): 如果QuerySet包含數據,就返回True,否則返回False
注意注意:一定區分model對象與querySet的區別 !!!
model對象可以調用它下面的所有屬性方法,可以用.的形式調用屬性,Queryset得到的是一個集合。
2.雙下划線之單表查詢
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於11、22、33的數據 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 models.Tb1.objects.filter(id__range=[1, 2]) # 范圍bettwen and startswith,istartswith, endswith, iendswith
六、刪除表記錄
刪除方法就是 delete()。它運行時立即刪除對象而不返回任何值。
比如我們給表中添加一個刪除按鈕來實現點擊按鈕后數據庫每條記錄的刪除
1.template模板
{% for book_obj in bookList %} <tr> <td>{{ book_obj.nid }}</td> <td>{{ book_obj.title }}</td> <td>{{ book_obj.author }}</td> <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td> <td>{{ book_obj.price }}</td> <td> <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">刪除</button></a> </td> </tr> {% endfor %}
2.url分發
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^del/(\d+)', views.delBook), ]
3.視圖函數view實現刪除
def delBook(request,id): models.Book.objects.filter(nid=id).delete() return redirect("/index/")