【django】——models模型CRUD操作

 

增Create

1.保存

要創建對象,請使用模型類的關鍵字參數將其實例化,然後調用save()將其保存到數據庫。

#方式一 Test模塊常用 一個步驟中創建和保存對象
models.Entity.objects.create(c1='xx', c2='oo')   # 增加一條數據,可以接受字典類型數據 **kwargs

#方式二 
obj = models.Entity(c1='xx', c2='oo')
obj.save()

該save()方法沒有返回值。如果模型具有一個AutoField自動遞增的主鍵,則該自動遞增的值將被計算並在您首次調用時保存爲對象上的屬性。

2.保存ForeignKey和ManyToManyField字段 

一個博客功能的實例:

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):
        return self.headline

更新ForeignKey字段的工作原理與保存普通字段的方法完全相同,只需將正確類型的對象分配給相關字段即可。此示例更新blog的屬性 Entry,假設的適當的實例Entry和 Blog已經保存到數據庫。

from blog.models import Blog, Entry

entry = Entry.objects.get(pk=1)
cheese_blog = Blog.objects.get(name="Cheddar Talk")
entry.blog = cheese_blog
entry.save()

更新ManyToManyField作品的方式略有不同-使用 add()字段上的方法向關係中添加記錄。本示例將Author實例 添加joeentry對象:

from blog.models import Author

joe = Author.objects.create(name="Joe")
entry.authors.add(joe)

要ManyToManyField一次性添加多個記錄,請在的調用中包含多個參數 add(),如下所示:

john = Author.objects.create(name="John")
paul = Author.objects.create(name="Paul")
george = Author.objects.create(name="George")
ringo = Author.objects.create(name="Ringo")
entry.authors.add(john, paul, george, ringo)

3.保存指定字段

save()在關鍵字arguments中傳遞了字段名稱列表 update_fields,則僅更新該列表中命名的字段。

product.name = 'Name changed again'
product.save(update_fields=['name'])

查Retrieve

1.查詢所有對象

all_entries = Entry.objects.all()

該all()方法返回的QuerySet包含數據庫中所有對象。

2.使用過濾查詢特定對象

filter(**kwargs)

返回QuerySet包含與給定查找參數匹配的新的對象。

exclude(**kwargs)

返回一個新的QuerySet包含對象,這些對象與給定的查找參數不匹配。

Entry.objects.filter(name='foot')

Entry.objects.exclude(name='foot')

鏈接過濾器

Entry.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.date.today()
... ).filter(
...     pub_date__gte=datetime.date(2005, 1, 30)
... )

過濾後的QuerySets是唯一的

每次過濾都會創建一個單獨的,獨特的QuerySet,可以存儲,使用和重用。

q1 = Entry.objects.filter(headline__startswith="What")
q2 = q1.exclude(pub_date__gte=datetime.date.today())
q3 = q1.filter(pub_date__gte=datetime.date.today())

這三個QuerySets是分開的。第一個是QuerySet包含所有條目的基礎 ,這些條目包含以“ What”開頭的標題。第二個是第一個的子集,帶有附加條件,該條件不包括pub_date今天或將來的記錄。第三個是第一個的子集,帶有一個附加條件,該條件僅選擇pub_date今天或將來的記錄。首字母QuerySet(q1)不受優化過程的影響。

3.查詢單個對象

如果您知道只有一個對象與您的查詢匹配,則可以在Manger上使用get()直接返回該對象 。

one_entry = Entry.objects.get(pk=1)

如果沒有與查詢匹配的結果,get()將引發DoesNotExist 異常。在上面的代碼中,如果沒有Entry主鍵爲1的對象,則Django會引發Entry.DoesNotExist

同樣,如果有多個項目與get()查詢匹配,它將引發MultipleObjectsReturned

返回指定字段

values() 接收可選的位置參數*fields,它指定SELECT 應該限制哪些字段。如果指定字段,每個字典將只包含指定的字段的鍵/值。如果沒有指定字段,每個字典將包含數據庫表中所有字段的鍵和值。

# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
[<Blog: Beatles Blog>]

# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]

>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]

4.進階查詢之神奇的雙下劃線

· 大於、小於

Entry.objects.filter(id__gt=1)               # 獲取id大於1的值
Entry.objects.filter(id__gte=1)              # 獲取id大於等於1的值
Entry.objects.filter(id__lt=10)              # 獲取id小於10的值
Entry.objects.filter(id__lte=10)             # 獲取id小於10的值
Entry.objects.filter(id__lt=10, id__gt=1)    # 獲取id大於1 且 小於10的值

#SELECT * FROM app_entry WHERE id <= 10;

· 成員判斷in

Entry.objects.filter(id__in=[11, 22, 33])   # 獲取id等於11、22、33的數據
Entry.objects.exclude(id__in=[11, 22, 33])  # not in

##SELECT * FROM app_entry WHERE id in (11,22,33);

· 模糊包含contains

Entry.objects.filter(name__contains="ven")
Entry.objects.filter(name__icontains="ven") # icontains大小寫不敏感
Entry.objects.exclude(name__icontains="ven")

#SELECT ... WHERE name LIKE '%ven%';

· 其他匹配

startswith,istartswith, endswith, iendswith,

· 範圍range

Entry.objects.filter(id__range=[1, 2])   # 範圍bettwen and

· 排序order by

Entry.objects.filter(name='seven').order_by('id')    # asc
Entry.objects.filter(name='seven').order_by('-id')   # desc

· 分組group by

models.Tb.objects.filter(c1=1).values('id').annotate(c=Count('num'))

# SELECT app_tb.id", COUNT(app_tb.num) AS c FROM app_tb WHERE app_tb.c1 = 1 GROUP BY app_tb.id

· limit 、offset

#返回前5個對象():LIMIT 5
Entry.objects.all()[:5]

#返回第六個到第十個對象():OFFSET 5 LIMIT 5
Entry.objects.all()[5:10]

要檢索單個對象而不是列表,請使用簡單索引而不是切片。例如,在按標題按字母順序對條目進行排序之後,這將返回數據庫中的第一個:SELECT foo FROM bar LIMIT 1

Entry.objects.order_by('headline')[0]

這大致相當於:

Entry.objects.order_by('headline')[0:1].get()

· 計數

Entry.objects.filter(name='seven').count()

· 是否爲空

Entry.objects.filter(pub_date__isnull=True)

· 時間 year / month / day / week_day / hour / minute / second / gt: 年 / 月 / 日 / 周 / 時 / 分 / 秒 /

Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__month__gte=6)
Entry.objects.filter(pub_date__day=3)
Entry.objects.filter(pub_date__week_day=2)
Event.objects.filter(time__hour=5)
Event.objects.filter(timestamp__minute__gte=29)
Event.objects.filter(time__second=2)

刪Delete

刪除掉單個數據

Entry.objects.get(id=4).delete()  

刪除指定條件的數據

Entry.objects.filter(name='seven').delete()  

刪除所有數據

Entry.objects.all().delete()  

改Update

改既可以用save方法,也可以用update方法。其區別在於save方法不僅可以更新數據中現有對象數據,還可以創建新的對象。而update方法只能用於更新已有對象數據。一般來說,如果要同時更新多個對象數據,用update方法更合適。

利用save方法更新

obj = Entry.objects.get(id=1)
obj.name = '111'
obj.save()   

利用update方法更新

obj = Entry.objects.get(id=1).update(name='new title')

利用update方法更新多條數據

Entry.objects.filter(name__icontains='python').update(name='Django')

常用操作

<1> all():                          查詢所有結果

<2> get(**kwargs):         返回與所給篩選條件相匹配的對象,返回結果有且只有一個,如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
 
<3> filter(**kwargs):      它包含了與所給篩選條件相匹配的對象
 
<4> exclude(**kwargs):     它包含了與所給篩選條件不匹配的對象
 
<5> values(*field):          返回一個ValueQuerySet——一個特殊的QuerySet,運行後得到的並不是一系列model的實例化對象,

                                         而是一個可迭代的字典序列
 
<6> values_list(*field):   它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
 
<7> order_by(*field):      對查詢結果排序
 
<8> reverse():                 對查詢結果反向排序,請注意reverse()通常只能在具有已定義順序的QuerySet上調用(在model類的Meta

                                        中指定ordering或調用order_by()方法)。
 
<9> distinct():                 從返回結果中剔除重複紀錄(如果你查詢跨越多個表,可能在計算QuerySet時得到重複的結果。此時可以使

                                         用distinct(),注意只有在PostgreSQL中支持按字段去重。)
 
<10> count():                   返回數據庫中匹配查詢(QuerySet)的對象數量。
 
<11> first():                      返回第一條記錄
 
<12> last():                      返回最後一條記錄
 
<13> exists():                  如果QuerySet包含數據,就返回True,否則返回False

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章