Making queries(執(zhí)行查詢)

一旦你創(chuàng)建了你的數(shù)據(jù)模型,Django會自動為你提供一個數(shù)據(jù)庫抽取API,讓你創(chuàng)建、檢索、更新和刪除對象。 本文檔介紹了如何使用這個API。 有關(guān)所有各種模型查找選項(xiàng)的完整詳細(xì)信息,請參閱數(shù)據(jù)模型參考。

在本指南(以及參考資料)中,我們將參考以下模型,這些模型包含一個Weblog應(yīng)用程序:

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

Creating objects

為了在Python對象中表示數(shù)據(jù)庫表數(shù)據(jù),Django使用了一個直觀的系統(tǒng):模型類表示一個數(shù)據(jù)庫表,該類的一個實(shí)例表示數(shù)據(jù)庫表中的一個特定記錄。

要創(chuàng)建一個對象,使用模型類的關(guān)鍵字參數(shù)實(shí)例化它,然后調(diào)用save()將其保存到數(shù)據(jù)庫中。

假設(shè)模型存在mysite/blog/models.py文件中,這里是一個例子:

>>> from blog.models import Blog
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
>>> b.save()

這將在幕后執(zhí)行INSERT SQL語句。 直到你顯式地調(diào)用save()之前,Django才會觸發(fā)數(shù)據(jù)庫。
save()方法沒有返回值。

另外,save()需要一些在這里沒有描述的高級選項(xiàng)。 有關(guān)完整的詳細(xì)信息,請參閱save()文檔。要在一個步驟中創(chuàng)建和保存對象,請使用create()方法。

Saving changes to objects

要保存對數(shù)據(jù)庫中已有對象的更改,請使用save()。
給定一個已經(jīng)保存到數(shù)據(jù)庫的Blog實(shí)例b5,這個例子改變它的名字并更新數(shù)據(jù)庫中的記錄:

>>> b5.name = 'New name'
>>> b5.save()

這在幕后執(zhí)行UPDATE SQL語句。 直到你顯式地調(diào)用save()之前,Django才會觸發(fā)數(shù)據(jù)庫。

Saving ForeignKey and ManyToManyField fields

更新ForeignKey字段的方式與保存普通字段的方式完全相同 - 只需將正確類型的對象分配給相關(guān)字段即可。 這個例子更新了一個Entry實(shí)例條目的博客屬性,假設(shè)Entry和Blog的實(shí)例已經(jīng)被保存到數(shù)據(jù)庫中(所以我們可以在下面檢索它們):

>>> 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的工作方式有點(diǎn)不同 - 在字段上使用add()方法將記錄添加到關(guān)系。 這個例子將Author實(shí)例joe添加到條目對象中:

>>> from blog.models import Author
>>> joe = Author.objects.create(name="Joe")
>>> entry.authors.add(joe)

要一次將多條記錄添加到ManyToManyField,請?jiān)?code>add()的調(diào)用中包含多個參數(shù),如下所示:

>>> 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)

如果您嘗試分配或添加錯誤類型的對象,Django會報(bào)錯。

Retrieving objects

要從您的數(shù)據(jù)庫中檢索對象,請通過模型類上的管理器構(gòu)建一個QuerySet。

QuerySet表示數(shù)據(jù)庫中的對象的集合。 它可以有零個,一個或多個過濾器。 篩選器根據(jù)給定的參數(shù)縮小查詢結(jié)果的范圍。 在SQL術(shù)語中,QuerySet等同于SELECT語句,過濾器是限制性子句,如WHERELIMIT。

您可以使用模型的管理器獲取QuerySet。 每個模型至少有一個管理器,默認(rèn)情況下稱為對象。 通過模型類直接訪問它,如下所示:

>>> Blog.objects
<django.db.models.manager.Manager object at ...>
>>> b = Blog(name='Foo', tagline='Bar')
>>> b.objects
Traceback:
    ...
AttributeError: "Manager isn't accessible via Blog instances."

注意:管理人員只能通過模型類訪問,而不能通過模型實(shí)例訪問,以實(shí)現(xiàn)“表級”操作和“記錄級”操作之間的分離。

Manager是模型的QuerySets的主要來源。 例如,Blog.objects.all()返回包含數(shù)據(jù)庫中所有Blog對象的QuerySet。

Retrieving all objects

從表中檢索對象最簡單的方法是獲取所有的對象。 為此,請使用Manager上的all()方法:

>>> all_entries = Entry.objects.all()

all()方法返回?cái)?shù)據(jù)庫中所有對象的QuerySet。

Retrieving specific objects with filters

未完待續(xù)...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容