一旦你創(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語句,過濾器是限制性子句,如WHERE或LIMIT。
您可以使用模型的管理器獲取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。