django 一對多的添加記錄create 和save 方法,update 更新和save()方法的區別,查詢API的方法
轉發之https://www.cnblogs.com/gyh04541/p/7910004.html
查詢api的方法:
表.objects.all() ---[obj1,obj2,....]
表.objects.all().first()
表.objects.filter(id=2) ---[obj1,] ,得到一個集合對象,集合裏只有一個,跟上first()或者【0】取到一個具體對象
表.objects.get(id=2)---obj,得到一個單獨的對象,確定能找到,可以用,如果找到多個或者沒有的,都報錯。
QuerySet.first(),與get()方法一樣,都得到一個對象
QuerySet.last(),與get()方法一樣,都得到一個對象
----update 和save方法區別
Book.objects.filter(id=5).update(price=1000) #直接更新update 是QuerySet集合對象的方法,推薦
save方法
book = Book.objects.get(id=5)
book.price=400
book.save()
------value方法,
values(*field),得到一個可叠代的字典序列,不再是一個個對象,而是對象的值,#得到QuerySet集合是所有的記錄,,裏面是字典,key是字段,value是值
def query_value(request): b1= Book.objects.values(‘title‘)#title值字段 # print(b1) #得到QuerySet集合是所有的記錄,,裏面是字典,key是字段,value是值, #< QuerySet[{‘title‘: ‘Linux‘}, {‘title‘: ‘項塔蘭‘}, {‘title‘: ‘追風箏的人‘}, {‘title‘: ‘富爸爸‘}] > b2 = Book.objects.values(‘title‘,‘price‘)#可以加多個字段 print(b2) #< QuerySet[{‘title‘: ‘Linux‘, ‘price‘: Decimal(‘30.00‘)},# {‘title‘: ‘項塔蘭‘, ‘price‘: Decimal(‘45.00‘)}, # {‘title‘: ‘追風箏的人‘, ‘price‘: Decimal(‘39.90‘)}, # {‘title‘: ‘富爸爸‘, ‘price‘: Decimal(‘23.00‘)}] > b3 = Book.objects.filter(id__gt=4).values(‘title‘)#查詢id大於4,的title,得到一個對象集合,顯示書名 #<QuerySet [{‘title‘: ‘富爸爸‘}]> print(b3) return HttpResponse(‘value 方法的查詢方法‘)
---
value_list ( ) 得到一個元組格式的數據,只有字段的值,
# ----valuelist 方法查詢 ,得到一個元組格式數據,只有字段的值, b4 = Book.objects.filter(id__gt=3).values_list(‘title‘) print(b4) #<QuerySet [(‘追風箏的人‘,), (‘富爸爸‘,)]>
exclude()方法,
b5 = Book.objects.exclude(id__gt=3)#exclude 排除 ,查詢id大於4的以外的書籍,<QuerySet [<Book: Linux>, <Book: 項塔蘭>]> b6 = Book.objects.filter(id__lt=4)# 查詢id小於4 的書籍 <QuerySet [<Book: Linux>, <Book: 項塔蘭>]> print(b5) print(b6) #b5 和b6 得到結果一樣,
----
其他查詢方法
# <6>order_by(*field): 對查詢結果排序 # <7>reverse(): 對查詢結果反向排序,---需要先排序order_by(*field),才能反轉 # <8>distinct(): 從返回結果中剔除重復紀錄 # <9>values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 # <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 # exclude 不包含指定的數據
# 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,
在url文件中匹配路由和視圖函數add
#mysql 拷貝是不能用,有配置信息, #是要需要修改配置 from gu_orm import views urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^add/$‘,views.add), ]
添加一條記錄有2種方法
create方法有2種,save方法
create方法1 :給一對多的關系表中添加數據 ,寫死,直接對應數據庫的字段添加,是一組組鍵值對
先給PUblish表添加記錄,手動添加,點擊 --減號右邊 DB 就可以保存,
註意:PUblish表要在book表上面,因為生成表的時候,book表有PUblish_id的字段,所以會先找到PUblish表,然後在book中添加對應的id號,要不報錯
在model裏創建表,
book與PUblish是一對多的關系,一個出版社可以出版多種書,外鍵就要建在多的表中,
from django.db import models
# Create your models here.
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5 , decimal_places=2)
#書籍與出版社是一對多,書是多,出版社是一,外鍵(子表)建在多的表中,
#publish 作為一個外鍵 與Book 表建立一對多關系,默認綁定到Book 的主鍵id上
publish = models.ForeignKey(Publish,)
#一對多的增刪改查,
#做增加
#先給一 的表添加數據,才能在對應的多 的表增加數據,要不Publish_id 沒有值,
from django.db import models # Create your models here. class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5 , decimal_places=2) #書籍與出版社是一對多,書是多,出版社是一,外鍵(子表)建在多的表中, #publish 作為一個外鍵 與Book 表建立一對多關系,默認綁定到Book 的主鍵id上 publish = models.ForeignKey(Publish,) #一對多的增刪改查, #做增加 #先給一 的表添加數據,才能在對應的多 的表增加數據,要不Publish_id 沒有值,
在views文件中
先導入從model 已經創鍵的表Book表, 給book表增加數據,
Book.objects.cteate(),用create方法創建表,
數據庫的字段對應要添加值,然後運行項目,
from django.shortcuts import render,HttpResponse # Create your views here. from gu_orm.models import * -----從models表中導入所有的表, def add(request): #添加一條book記錄 Book.objects.create( title = ‘千城之城‘, price = 11.90, publish_id = 1#以數據庫的字段為準, ) return HttpResponse(‘ok‘)
此時就可以看到數據庫book表中就有了一條記錄,並且對應著一條PUblish的記錄
=====
獲取對象的具體值,單個對象字段屬性
#從數據庫獲取一條記錄, book_obj = Book.objects.get(id=1) print(book_obj.title) print(book_obj.price)
運行項目,得到結果,,,
千城之城
11.90
現在打印book表中一個外鍵的字段PUblish
print(book_obj.publish) ------Publish object 得到一個對象,是PUblish表中的一條記錄,對應書中的一條記錄,,是一個對象,因為是一對多的關系
要想顯示外鍵的具體的值,就在PUblish表加上__str__(self):,就會顯示具體的值,而不再是對象
如下,
class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) #有了__str__()方法,就可以看到對象具體的值,沒有它 ,打印對象,就是一個對象, # 當用到PUblish表中字段的時候, # 就可以看到對象具體的值,而不再是一個看不懂的對象, def __str__(self): return self.name
此時再打印book表的外鍵,
#打印外鍵字段publish print(book_obj.publish) ---北京出版社 #Publish object 得到一個對象,是 publsih表中對應的一條記錄也就是一個對象, #看不到具體的值,想看到對象具體的值,就用 __str__()方法,所以在models裏 #就可以用__str__(),就可以看到外鍵的具體值,而不再是一個對象,
---所以在每個表中,都可以使用__str__(self)方法,顯示對象的具體的值
要想顯示多個值也可以,用+ 號,記得空開距離
def __str__(self):
return self.name +" "+self.addr
create方法2 :給一對多的關系表中添加數據
先創建一個PUblish對象
#方法2,先找到一個出版社對象 publish_obj = Publish.objects.get(id=2)
然後再用create方法,把publish_obj對象給publish表
![技術分享圖片](/img/fz.gif)
#創建book對象, Book.objects.create( title = ‘項塔蘭‘, price = 23.50, publish = publish_obj, )
![技術分享圖片](/img/fz.gif)
運行程序,重新訪問視圖函數add,url地址欄重新訪問add,數據庫就了新添加的記錄
添加記錄方法2,
=====save方法
#save 方法,用實例出來的對象保存
# 一對多,
p = Publish(name=‘人民出版社‘,addr=‘昌平‘)
p.save()#把對象保存到數據庫
#與PUblish表添加一個對象,既一條記錄
book = Book(title = ‘追風箏的孩子‘,price = ‘15.00‘,publish = p)
#與PUblish的publish_id綁定一個存在的記錄,既對象
book = Book(title = ‘追風箏的孩子‘,price = ‘15.00‘,publish_id = 3)
book.save() #保存到數據庫
django 一對多的添加記錄create 和save 方法,update 更新和save()方法的區別,查詢API的方法