1. 程式人生 > >django 一對多的添加記錄create 和save 方法,update 更新和save()方法的區別,查詢API的方法

django 一對多的添加記錄create 和save 方法,update 更新和save()方法的區別,查詢API的方法

bubuko 只有一個 pan 單獨 mode dig 萬能 .... .site

轉發之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表

技術分享圖片
 #創建book對象,
    Book.objects.create(
        title = ‘項塔蘭‘,
        price = 23.50,
        publish = publish_obj,
    )
技術分享圖片

運行程序,重新訪問視圖函數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的方法