一.創建表 django中ORM和資料庫的映射關係: 表名 <-------> 類名 欄位 <-------> 屬性 表記錄 <------->類實例對象 創建表就是一個創建類的過程: 外鍵,一對一,多對多: 二.添加記錄 三.查詢記錄 3.1 查詢相關API 3.2 基於對象的跨表查詢(子查詢) ...
一.創建表
django中ORM和資料庫的映射關係:
表名 <-------> 類名
欄位 <-------> 屬性
表記錄 <------->類實例對象
創建表就是一個創建類的過程:
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=3)
python manage.py makemigrations
python manage.py migrate
外鍵,一對一,多對多:
class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) age=models.IntegerField() # 與AuthorDetail建立一對一的關係 authorDetail=models.OneToOneField(to="AuthorDetail") class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday=models.DateField() telephone=models.BigIntegerField() addr=models.CharField( max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) city=models.CharField( max_length=32) email=models.EmailField() 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) # 與Publish建立一對多的關係,外鍵欄位建立在多的一方 publish=models.ForeignKey(to="Publish",to_field="nid") # 與Author表建立多對多的關係,ManyToManyField可以建在兩個模型中的任意一個,自動創建第三張表 authors=models.ManyToManyField(to='Author')
''' 註意事項: 1、id 欄位是自動添加的 2、對於外鍵欄位,Django 會在欄位名上添加"_id" 來創建資料庫中的列名 3、這個例子中的CREATE TABLE SQL 語句使用PostgreSQL 語法格式,要註意的是Django 會根據settings 中指定的資料庫類型來使用相應的SQL 語句。 4、定義好模型之後,你需要告訴Django _使用_這些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中設置,在其中添加models.py所在應用的名稱。 5、外鍵欄位 ForeignKey 有一個 null=True 的設置(它允許外鍵接受空值 NULL),你可以賦給它空值 None 。 '''
二.添加記錄
#單表添加 #方式一: publish_obj=Publish.objects.create(name="人民出版社", city="北京",email="[email protected]") #方式二: publish_obj=Publish(name="人民出版社",city="北京",email="[email protected]") publish_obj.save() #方式三: Publish.objects.create(**request.POST.dict())
#帶外鍵添加: #一: Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=665, pagegeNum= 334,publish_id=1) #二: publish_obj=Publish.objects.get(nid=1) Book.objects.create(title="金瓶眉",publishDate="2012-12-12", price=665,pageNum=334,publish=publish_obj)
#多對多添加 book_obj=Book.objects.create(title="追風箏的人",publishDate="2012-11-12",price=69,pageNum=314,publish_id=1) author_yuan=Author.objects.create(name="yuan",age=23,authorDetail_id=1) author_egon=Author.objects.create(name="egon",age=32,authorDetail_id=2) book_obj.authors.add(author_egon,author_yuan) '''將某個特定的 model 對象添加到被關聯對象集合中。 ======= book_obj.authors.add(*[]) ''' #接觸關係 book_obj.authors.remove() # 將某個特定的對象從被關聯對象集合中去除。 ====== book_obj.authors.remove(*[]) book_obj.authors.clear() #清空被關聯對象集合。
三.查詢記錄
3.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
#雙下單表操作 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
3.2 基於對象的跨表查詢(子查詢)
3.2.1 正向查詢(按欄位)
#一對多 # 查詢nid=1的書籍的出版社所在的城市<br> book_obj=Book.objects.get(nid=1) print(book_obj.publish.city)
#一對一 author_egon=Author.objects.get(name="egon") print(author_egon.authorDetail.telephone)
#多對多 # 金瓶眉所有作者的名字以及手機號 book_obj=Book.objects.filter(title="金瓶眉").first() authors=book_obj.authors.all() for author_obj in authors: print(author_obj.name,author_obj.authorDetail.telephone)
3.2.2 反向查詢
#一對多 #表名小寫+'_'+'set' book_list=Publish.objects.filter(name='人民出版社').first().book_set.all() print(book_list)
#一對一 #表名小寫 #住在天堂的作者的名字 author_obj=AuthorDetail.objects.filter(addr='天堂').author print(author_obj.name)
#多對多 #表名小寫_set # 查詢egon出過的所有書籍的名字 book_objs=Author.objects.filter(name='egon').first().book_set.all() for book_obj in book_objs: print(book_obj,book_obj.title)
3.3 基於雙下劃線的跨表查詢(join查詢)
註意:正向查詢按欄位,反向查詢按表名
# 練習1: 查詢人民出版社出版過的所有書籍的名字與價格(一對多) # 正向查詢 按欄位:publish queryResult=Book.objects .filter(publish__name="人民出版社") .values_list("title","price") # 反向查詢 按表名:book queryResult=Publish.objects .filter(name="人民出版社") .values_list("book__title","book__price") # 練習2: 查詢egon出過的所有書籍的名字(多對多) # 正向查詢 按欄位:authors: queryResult=Book.objects .filter(authors__name="yuan") .values_list("title") # 反向查詢 按表名:book queryResult=Author.objects .filter(name="yuan") .values_list("book__title","book__price") # 練習3: 查詢人民出版社出版過的所有書籍的名字以及作者的姓名 # 正向查詢 queryResult=Book.objects .filter(publish__name="人民出版社") .values_list("title","authors__name") # 反向查詢 queryResult=Publish.objects .filter(name="人民出版社") .values_list("book__title","book__authors__age","book__authors__name") # 練習4: 手機號以151開頭的作者出版過的所有書籍名稱以及出版社名稱 queryResult=Book.objects .filter(authors__authorDetail__telephone__regex="151") .values_list("title","publish__name"
3.4 聚合參數與分組查詢
#聚會:aggregate(*args,**kwargs) >>> Book.objects.all().aggregate(Avg('price')) {'price__avg': 34.35} #aggregate()是QuerySet 的一個終止子句,意思是說,它返回一個包含一些鍵值對的字典。 #可以向aggregate()子句中添加多個參數 >>> from django.db.models import Avg, Max, Min >>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price')) {'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
#分組 annotate() bookList=Book.objects.annotate(authorsNum=Count('authors')) for book_obj in bookList: print(book_obj.title,book_obj.authorsNum)
3.5 F Q查詢
e.update()
四.修改記錄
五.刪除記錄
e.delete()