一、ORM : object relationship mapping 對象映射關系
映射關系:
表名 <-------> 類名 字段 <-------> 屬性 表記錄 <------->類實例對象
二、創建表(建立模型) 必須是先創建表,再啟動項目
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
)
keepNum
=
models.IntegerField()
Book(nid=2,title='alex傳',
publishDate
='2017-10-25',price='100.22',keepNum=2) #實例化對象就是在Book表中添加 記錄
創建數據庫的兩條命令:
python manage.py makemigrations #app01(應用中的migrations文件夾中會生成一個文件)這是第一步:翻譯,把你寫的類中的信息進行調整,對應
python manage.py migrate #這是第二步 :是把sql語句執行,所有的表才會生成
注意1:.sqlite3 數據庫會自動創建數據庫,不需要提前創建,直接啟動項目就可以了
注意2:使用mysql數據庫時,在第一步創建庫的時候django會報錯,那是因為django默認按mysqldb執行,但是在python3版本中,沒有mysqldb,只有pymysql,故: 在應用(app01)下面的__init__.py中需配置一下:
import pymysql pymysql.install_as_MySQLdb()
然后再執行創建數據庫的命令。
注意3:更換mysql數據庫時需要在settings中更改設置
#把 sqlite3數據庫有關 信息 注釋掉 # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog', #你的數據庫名稱 'USER': 'root', #你的數據庫用戶名 'PASSWORD': '', #你的數據庫密碼 'HOST': '', #你的數據庫主機,留空默認為localhost 'PORT': '3306', #你的數據庫端口 } }
補充:在settings文件中通過logging的設置可以查看翻譯成的sql語句

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level': 'DEBUG', }, } }
三、添加表記錄
1.普通字段: 推薦使用方式2
方式1 :類的實例化,需要save publish_obj=Publish(name="人民出版社",city="北京",email="renMin@163.com") publish_obj.save() # 將數據保存到數據庫 方式2 返回值publish_obj是添加的記錄對象 ,不需要save publish_obj=Publish.objects.create(name="人民出版社",city="北京",email="renMin@163.com")
四、修改表記錄
# 修改方式1:save(效率低) book_obj=models.Book.objects.filter(nid=id)[0] book_obj.title="金平" book_obj.save() #效率低是因為不管你是不是修改一個字段的值,django都會重新把所有的字段值賦值一遍。
# 修改方式2: 推薦使用
models.Book.objects.filter(nid=1).update(title='title',author='author',publishDate='pubDate',price='price')
五、刪除表記錄
models.Info.objects.filter(id=1).delete()
models.Info.objects.get(id=1).delete()
六、查詢表記錄
1.查詢相關API
<1> all(): 查詢所有結果 <2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象,可以多個條件,在括號內用逗號隔開 <3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個, 如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。 <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

查詢方法API: 1 all: models.表名.objects.all() book_all=models.Book.objects.all() # 結果是querySet集合 [model對象,....] print(book_all) # <QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]> 2 filter: models.表名.objects.filter() # 結果是querySet集合 [model對象,....] ret1=models.Book.objects.filter(author="yuan") # # <QuerySet [<Book: 追風箏的人>, <Book: asd>]> ret2=models.Book.objects.filter(nid=1) # <QuerySet [<Book: yuan>]> ret2=models.Book.objects.filter(author="yuan",price=123) # <QuerySet [<Book: yuan>]> print(ret2) 3 get models.表名.objects.get() # model對象 ret3=models.Book.objects.get(author="yuan") print(ret3.price) 4 exclude : 排除條件 ret4=models.Book.objects.exclude(author="yuan") print(ret4) 5 values方法 ret=models.Book.objects.filter(author="yuan").values("title","price") print(ret)# <QuerySet [{'title': '追風箏的人', 'price': Decimal('99.00')}, {'title': 'asd', 'price': Decimal('123.00')}]> 6 values_list方法 ret = models.Book.objects.filter(author="yuan").values_list("title", "price") print(ret) # <QuerySet [('追風箏的人', Decimal('99.00')), ('asd', Decimal('123.00'))]> 7 distinct方法 ret=models.Book.objects.filter(author="yuan").values("author").distinct() print(ret) 8 count方法 ret=models.Book.objects.filter(author="yuan").count() print(ret) 9 first 方法 ret = models.Book.objects.all().first() print(ret) 10 exists方法 if models.Book.objects.all().exists(): print("exists") else: print("nothing")
注意:一定區分object與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 ret=models.Book.objects.filter(price__gt=100) #大於 ret=models.Book.objects.filter(price__gte=99) # 大於等於 ret=models.Book.objects.filter(publishDate__year=2017,publishDate__month=10) #2017年10月 ret=models.Book.objects.filter(author__startswith="張") startswith,istartswith, endswith, iendswith