Django Tutorial Part 3: Using models

2018-05-15 17:26 更新
先決條件: Django教程第2部分:創(chuàng)建骨架網(wǎng)站。
目的: 為了能夠設(shè)計(jì)和創(chuàng)建自己的模型,適當(dāng)?shù)剡x擇字段。

概述

Django Web應(yīng)用程序通過稱為模型的Python對(duì)象訪問和管理數(shù)據(jù)。 模型定義存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),包括字段類型以及可能的最大大小,默認(rèn)值,選擇列表選項(xiàng),文檔幫助文本, 等等。模型的定義獨(dú)立于底層數(shù)據(jù)庫 - 您可以選擇其中一個(gè)作為項(xiàng)目設(shè)置的一部分。 一旦你選擇了要使用的數(shù)據(jù)庫,你就不需要直接與它交談 - 你只需要寫你的模型結(jié)構(gòu)和其他代碼,Django處理所有與數(shù)據(jù)庫溝通的骯臟的工作。

本教程介紹如何定義和訪問 LocalLibrary網(wǎng)站的模型 例。

設(shè)計(jì)LocalLibrary模型

在你跳入并開始編碼模型之前,值得花幾分鐘時(shí)間考慮我們需要存儲(chǔ)什么數(shù)據(jù)以及不同對(duì)象之間的關(guān)系。

我們知道我們需要存儲(chǔ)關(guān)于圖書的信息(標(biāo)題,摘要,作者,書面語言,類別,ISBN),并且我們可能有多個(gè)副本可用(具有全球唯一的ID,可用性狀態(tài)等)。 我們可能需要存儲(chǔ)有關(guān)作者的更多信息,而不僅僅是他們的姓名,并且可能有多個(gè)作者使用相同或相似的名稱。 我們希望能夠根據(jù)書名,作者,書面語言和類別對(duì)信息進(jìn)行排序。

在設(shè)計(jì)模型時(shí),為每個(gè)"對(duì)象"(相關(guān)信息組)分別建立模型是有意義的。 在這種情況下,明顯的對(duì)象是書,書實(shí)例和作者。

您可能還想使用模型來表示選擇列表選項(xiàng)(例如,像下拉列表中的選項(xiàng)),而不是將選擇硬編碼到網(wǎng)站本身 - 這是建議當(dāng)所有的選項(xiàng)都不知道前面或可能 更改。 在這種情況下,模型的明顯候選包括書種類(例如科幻小說,法國詩歌等)和語言(英語,法語,日語)。

一旦我們決定了我們的模型和領(lǐng)域,我們需要考慮關(guān)系。 Django允許您定義一對(duì)一( OneToOneField ),一對(duì)多( ForeignKey )和多對(duì)多( ManyToManyField )的關(guān)系。

考慮到這一點(diǎn),下面的UML關(guān)聯(lián)圖顯示了我們?cè)谶@種情況下定義的模型(如框)。 如上所述,我們已經(jīng)創(chuàng)建了書的模型(書的通用細(xì)節(jié)),書實(shí)例(系統(tǒng)中可用的書的特定物理副本的狀態(tài))和作者。 我們還決定了一個(gè)類型的模型,以便可以通過管理界面創(chuàng)建/選擇值。 我們決定不要為 BookInstance:status 建立模型 - 我們已經(jīng)對(duì)值進(jìn)行了硬編碼( LOAN_STATUS ),因?yàn)槲覀儾幌M@些值發(fā)生變化。 在每個(gè)框中,您可以看到模型名稱,字段名稱和類型,以及方法及其返回類型。

該圖還示出了模型之間的關(guān)系,包括它們的多重性。 多重性是圖上的數(shù)字,其示出了可能存在于關(guān)系中的每個(gè)模型的數(shù)量(最大和最小)。 例如,框之間的連接線表示Book和類型相關(guān)。 接近Book模型的數(shù)字表明,一本書必須有一個(gè)或多個(gè)類型(根據(jù)你的喜好),而在類型旁邊的行的另一端的數(shù)字表明它可以有零個(gè)或多個(gè)相關(guān)聯(lián)的書。

注意:下一節(jié)提供了一個(gè)基本的說明,說明如何定義和使用模型。 當(dāng)你閱讀它,考慮我們將如何構(gòu)建上面的圖中的每個(gè)模型。

模型引物

本節(jié)簡要概述了模型的定義以及一些更重要的字段和字段參數(shù)。

模型定義

模型通常在應(yīng)用程序的 models.py 文件中定義。 它們被實(shí)現(xiàn)為 django.db.models.Model 的基類,并且可以包括字段,方法和元數(shù)據(jù)。 下面的代碼片段顯示了一個(gè)"典型"模型,命名為 MyModelName :

from django.db import models

class MyModelName(models.Model):
? ? """
? ? A typical class defining a model, derived from the Model class.
? ? """

?   # Fields
? ? my_field_name = models.CharField(max_length=20, help_text="Enter field documentation")
?   ...

?   # Metadata
    class Meta: 
?       ordering = ["-my_field_name"]

?   # Methods
? ? def get_absolute_url(self):
 ? ? ? ? """
 ? ? ? ? Returns the url to access a particular instance of MyModelName.
 ? ? ? ? """
 ? ? ? ? return reverse('model-detail-view', args=[str(self.id)])
? ??
? ? def __str__(self):
? ? ? ? """
? ? ? ? String for representing the MyModelName object (in Admin site etc.)
? ? ? ? """
? ? ? ? return self.field_name

在下面的部分中,我們將詳細(xì)探討模型中的每個(gè)特性:

Fields

模型可以具有任意數(shù)量的任何類型的字段 - 每個(gè)字段表示我們要存儲(chǔ)在我們的數(shù)據(jù)庫表中的一列數(shù)據(jù)。 每個(gè)數(shù)據(jù)庫記錄(行)將由每個(gè)字段值之一組成。 讓我們看看上面的例子:

my_field_name = models.CharField(max_length=20, help_text="Enter field documentation")

我們上面的例子有一個(gè)名為my_ field_name 的字段,類型為 models.CharField - 這意味著該字段將包含字母數(shù)字字符串。 使用特定類來分配字段類型,這些類確定用于將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中的記錄的類型以及當(dāng)從HTML表單接收到值(即,什么構(gòu)成有效值)時(shí)要使用的驗(yàn)證標(biāo)準(zhǔn)。 字段類型還可以包含進(jìn)一步指定字段如何存儲(chǔ)或可以使用的參數(shù)。 在這種情況下,我們給我們的字段兩個(gè)參數(shù):

  • max_length=20 — States that the maximum length of a value in this field is 20 characters.
  • help_text="Enter field documentation" — provides a text label to display to help users know what value to provide when this value is to be entered by a user via an HTML form.

字段名稱用于在查詢和模板中引用它。 字段還有一個(gè)標(biāo)簽,可以指定為參數(shù)( verbose_name ),也可以通過大寫字段變量名的第一個(gè)字母并用空格替換任何下劃線來推斷出來(例如 my_field_name / code>會(huì)有一個(gè)默認(rèn)標(biāo)簽我的字段名稱)。

如果模型以表單形式呈現(xiàn)(例如在管理網(wǎng)站中),則聲明字段的順序?qū)⒂绊懫淠J(rèn)順序,但這可能會(huì)被覆蓋。

Common field arguments

在聲明很多/大多數(shù)不同字段類型時(shí),可以使用以下常見參數(shù):

  • help_text: Provides a text label for HTML forms (e.g. in the admin site), as described above.
  • verbose_name:?A human-readable name for the field used in field labels.?If not specified, Django will infer the default verbose name from the field name.
  • default:?The default value for the field. This can be a value or a callable object, in which case the object will be called every time a new record is created.
  • null:?If True, Django will store blank values as NULL in the database for fields where this is appropriate (a CharField will instead store an empty string). The default is False.
  • blank:?If True, the field is allowed to be blank in your forms. The default is False, which means that Django's form?validation will force you to enter a value. This is often used with null=True , because if you're going to allow blank values, you also want the database to be able to represent them appropriately.
  • choices:?A group of?choices for this field. If this is provided, the default corresponding form widget will be a select box with these choices instead of the standard text field.
  • primary_key: If True, sets the current field as the primary key for the model (A primary key is a special database column designated to uniquely identify all the different table records). If no field is specified as the primary key then Django will automatically add a field for this purpose.

還有許多其他選項(xiàng) - 您可以查看字段完整列表 選項(xiàng)。

Common field types

以下列表描述了一些更常用的字段類型。

  • CharField is used to define short-to-mid sized fixed-length strings. You must specify the max_length of the data to be stored.
  • TextField is used for large arbitrary-length strings. You may specify a max_length for the field, but this is used only when the field is displayed in forms (it is not enforced at the database level).
  • IntegerField is a field for storing integer (whole number) values, and for validating entered values as integers in forms.
  • DateField and DateTimeField are used for storing/representing dates and date/time information (as Python datetime.date in and datetime.datetime objects, respectively). These fields can additionally declare the (mutually exclusive) parameters auto_now=True (to set the field to the current date every time the model is saved), auto_now_add (to only set the date when the model is first created) , and default (to set a default date that can be overridden by the user).
  • EmailField is used to store and validate email addresses.
  • FileField and ImageField are used to upload files and images respectively (the ImageField simply adds additional validation that the uploaded file is an image). These have parameters to define how and where the uploaded files are stored.
  • AutoField is a special type of IntegerField that automatically increments. A primary key of this type is automatically added to your model if you don’t explicitly specify one.
  • ForeignKey is used to specify a one-to-many relationship to another database model (e.g. a car has one manufacturer, but a manufacturer can make many cars). The "one" side of the relationship is the model that contains the key.
  • ManyToManyField is used to specify a many-to-many relationship (e.g. a book can have several genres, and each genre can contain several books). In our library app we will use these very similarly to ForeignKeys, but they can be used in more complicated ways to describe the relationships between groups. These have the parameter on_delete to define what happens when the associated record is deleted (e.g. a value of models.SET_NULL would simply set the value to NULL).

還有許多其他類型的字段,包括用于不同類型的數(shù)字(大整數(shù),小整數(shù),浮點(diǎn)數(shù)),布爾,URL,lug,唯一ID和其他"時(shí)間相關(guān)"信息(持續(xù)時(shí)間,時(shí)間等) 。 您可以在此查看完整列表

Metadata

您可以通過聲明類Meta 來為模型聲明模型級(jí)元數(shù)據(jù),如圖所示。

class Meta:
    ordering = ["-my_field_name"]
?   ...

此元數(shù)據(jù)的一個(gè)最有用的功能是控制在查詢模型類型時(shí)返回的記錄的默認(rèn)排序。 您可以通過在 ordering 屬性的字段名稱列表中指定匹配順序來完成此操作,如上所示。 排序?qū)⑷Q于字段的類型(字符字段按字母順序排序,而日期字段按時(shí)間順序排序)。 如上所示,您可以在字段名稱前添加減號(hào)( - )以反轉(zhuǎn)排序順序。

例如,如果我們默認(rèn)選擇這樣排序的書籍:

ordering = ["title", "-pubdate"]

書籍將按標(biāo)題,從A-Z,然后在每個(gè)標(biāo)題內(nèi)的發(fā)布日期從字母順序排序,從最新到最舊。

另一個(gè)常見屬性是 verbose_name ,該類的詳細(xì)名稱為單數(shù)和復(fù)數(shù)形式:

verbose_name = "BetterName"

其他有用的屬性允許您為模型創(chuàng)建和應(yīng)用新的"訪問權(quán)限"(默認(rèn)權(quán)限自動(dòng)應(yīng)用),允許基于另一個(gè)字段排序或聲明該類是"抽象"(無法創(chuàng)建的基類 記錄,并將改為從創(chuàng)建其他模型中導(dǎo)出)。

許多其他元數(shù)據(jù)選項(xiàng)控制什么數(shù)據(jù)庫必須用于模型以及數(shù)據(jù)如何存儲(chǔ)(如果您需要將模型映射到現(xiàn)有數(shù)據(jù)庫,這些僅僅有用)。

此處提供了元數(shù)據(jù)選項(xiàng)的完整列表:模型元數(shù)據(jù)選項(xiàng)( Django docs)。

Methods

模型也可以有方法。

最小的是,在每個(gè)模型中,你應(yīng)該定義標(biāo)準(zhǔn)的Python類方法 __ str __()為每個(gè)對(duì)象返回一個(gè)人類可讀的字符串。 此字符串用于表示管理站點(diǎn)(以及需要引用模型實(shí)例的任何其他位置)中的各個(gè)記錄。 通常,這將從模型返回標(biāo)題或名稱字段。

def __str__(self):
?   return self.field_name

在Django模型中包含的另一種常見方法是 get_absolute_url(),它返回一個(gè)用于在網(wǎng)站上顯示各個(gè)模型記錄的URL(如果你定義了這個(gè)方法,Django會(huì)自動(dòng)添加一個(gè)"View on Site"按鈕 到管理站點(diǎn)中模型的記錄編輯屏幕)。 get_absolute_url()的典型模式如下所示。

def get_absolute_url(self):
    """
    Returns the url to access a particular instance of the model.
    """
    return reverse('model-detail-view', args=[str(self.id)])

注意:假設(shè)您將使用像 / myapplication / mymodelname / 2 這樣的網(wǎng)址來顯示模型的各個(gè)記錄(其中"2"是 id 對(duì)于特定的記錄),您將需要?jiǎng)?chuàng)建一個(gè)URL映射器將響應(yīng)和id傳遞到"模型詳細(xì)視圖"(它將完成顯示記錄所需的工作)。 上面的 reverse()函數(shù)能夠"反轉(zhuǎn)"你的url映射器(在上面的例子中名為\'model-detail-view\'), 正確的格式

當(dāng)然要做這個(gè)工作,你還要寫URL映射,視圖和模板!

您還可以定義任何其他方法,并從代碼或模板中調(diào)用它們(前提是它們不帶任何參數(shù))。

模型管理

定義模型類后,可以使用它們創(chuàng)建,更新或刪除記錄,并運(yùn)行查詢以獲取所有記錄或記錄的特定子集。 我們將在教程中定義視圖時(shí)告訴您如何做,但這里是一個(gè)簡要的摘要。

Creating and modifying records

要?jiǎng)?chuàng)建記錄,您可以定義模型的實(shí)例,然后調(diào)用 save()。

# Create a new record using the model's constructor.
a_record = MyModelName(my_field_name="Instance #1")

# Save the object into the database.
a_record.save()

注意:如果您尚未將任何字段聲明為 primary_key ,則會(huì)自動(dòng)給出新記錄,字段名稱為 id 。 您可以在保存以上記錄后查詢此字段,它的值為1。

您可以使用點(diǎn)語法訪問此新記錄中的字段,并更改值。 您必須調(diào)用 save()才能將修改的值存儲(chǔ)到數(shù)據(jù)庫。

# Access model field values using Python attributes.
print(a_record.id) #should return 1 for the first record. 
print(a_record.my_field_name) # should print 'Instance #1'

# Change record by modifying the fields, then calling save().
a_record.my_field_name="New Instance Name"
a_record.save()

Searching for records

您可以使用模型的 objects 屬性(由基類提供)搜索符合特定條件的記錄。

注意:解釋如何使用"抽象"模型和字段名稱搜索記錄可能會(huì)有點(diǎn)混亂。 在下面的討論中,我們將使用 title genre 字段引用 Book 模型,其中g(shù)enre也是一個(gè)模型, code> name 。

我們可以使用 objects.all()獲得模型的所有記錄作為 QuerySet 。 QuerySet 是一個(gè)可迭代的對(duì)象,意味著它包含一些對(duì)象,我們可以迭代/循環(huán)。

all_books = Book.objects.all()

Django的 filter()方法允許我們過濾返回的 QuerySet 以匹配指定的文本數(shù)字 特定標(biāo)準(zhǔn)。 例如,要篩選標(biāo)題中包含"wild"的書籍,然后對(duì)其計(jì)數(shù),我們可以執(zhí)行以下操作。

wild_books = Book.objects.filter(title__contains='wild')
number_wild_books = Book.objects.filter(title__contains='wild').count()

匹配的字段和匹配類型在過濾器參數(shù)名稱中使用以下格式定義: field_name__match_type (注意 title 之間的 和包含上面的)。 上面我們使用區(qū)分大小寫的匹配過濾 title 。 還有許多其他類型的匹配可以做: icontains (不區(qū)分大小寫), iexact (case-insenstive完全匹配), exact 敏感的完全匹配),, gt (大于), startswith 等。 .djangoproject.com / en / 1.10 / ref / models / querysets /#field-lookups"class ="external">完整列表在這里。

在某些情況下,您需要對(duì)定義與另一個(gè)模型的一對(duì)多關(guān)系(例如 ForeignKey )的字段進(jìn)行過濾。 在這種情況下,您可以使用附加的雙下劃線"索引"到相關(guān)模型中的字段。 因此,例如要篩選具有特定類型模式的書籍,您必須通過 genre 字段將 name 編入索引,如下所示:

books_containing_genre = Book.objects.filter(genre__name__icontains='fiction')  # Will match on: Fiction, Science fiction, non-fiction etc.

注意:您可以根據(jù)需要使用下劃線(__)導(dǎo)航多級(jí)關(guān)系( ForeignKey / ManyToManyField )。 例如,具有不同類型的Book,使用另一個(gè)"cover"關(guān)系定義可能有一個(gè)參數(shù)名: type__cover__name__exact =\'hard\'。

還有很多你可以做的查詢,包括從相關(guān)模型向后搜索,鏈接過濾器,返回一個(gè)較小的值集等。更多信息,請(qǐng)參閱 1.10 / topics / db / queries /"class ="external">進(jìn)行查詢(Django Docs)。

定義LocalLibrary模型

在本節(jié)中,我們將開始定義庫的模型。 打開 models.py(在/ locallibrary / catalog /)。 頁面頂部的樣板導(dǎo)入了模型模塊,其中包含模型將繼承的模型基類 models.Model 。

from django.db import models

# Create your models here.

類型模型

復(fù)制下面顯示的類型模型代碼,并將其粘貼到 models.py 文件的底部。 該模型用于存儲(chǔ)關(guān)于書類別的信息 - 例如它是小說還是非小說,浪漫或軍事歷史等。如上所述,我們創(chuàng)建了類型作為模型而不是自由文本或 選擇列表,使得可以通過數(shù)據(jù)庫管理可能的值,而不是硬編碼。

class Genre(models.Model):
? ? """
? ? Model representing a book genre (e.g. Science Fiction, Non Fiction).
? ? """
? ? name = models.CharField(max_length=200, help_text="Enter a book genre (e.g. Science Fiction, French Poetry etc.)")
? ??
? ? def __str__(self):
? ? ? ? """
? ? ? ? String for representing the Model object (in Admin site etc.)
? ? ? ? """
? ? ? ? return self.name

模型有一個(gè) CharField 字段( name ),用于描述類型(這限制為200個(gè)字符,并且有一些 help_text 。在模型的末尾我們聲明一個(gè) __ str __()方法,它只返回一個(gè)特定記錄定義的類型的名字,沒有定義詳細(xì)的名字, 代碼>名稱。

書模型

復(fù)制下面的Book模型,然后將其粘貼到文件的底部。 書模型表示關(guān)于一般意義上的可用書的所有信息,而不是可用于貸款的特定實(shí)體"實(shí)例"或"拷貝"。 該模型使用 CharField 代表書的 title isbn (注意 isbn ISBN"使用第一未命名參數(shù),因?yàn)槟J(rèn)標(biāo)簽否則將是"Isbn")。 該模型對(duì) summary 使用 TextField ,因?yàn)榇宋谋究赡苄枰荛L時(shí)間。

from django.urls import reverse #Used to generate URLs by reversing the URL patterns

class Book(models.Model):
? ? """
? ? Model representing a book (but not a specific copy of a book).
? ? """
? ? title = models.CharField(max_length=200)
? ? author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
? ? # Foreign Key used because book can only have one author, but authors can have multiple books
? ? # Author as a string rather than object because it hasn't been declared yet in the file.
? ? summary = models.TextField(max_length=1000, help_text="Enter a brief description of the book")
? ? isbn = models.CharField('ISBN',max_length=13, help_text='13 Character <a  rel="external nofollow" target="_blank" >ISBN number</a>')
? ? genre = models.ManyToManyField(Genre, help_text="Select a genre for this book")
? ? # ManyToManyField used because genre can contain many books. Books can cover many genres.
? ? # Genre class has already been defined so we can specify the object above.
? ??
? ? def __str__(self):
? ? ? ? """
? ? ? ? String for representing the Model object.
? ? ? ? """
? ? ? ? return self.title
? ??
? ??
? ? def get_absolute_url(self):
? ? ? ? """
? ? ? ? Returns the url to access a particular book instance.
? ? ? ? """
? ? ? ? return reverse('book-detail', args=[str(self.id)])

類型是一個(gè) ManyToManyField ,這樣一本書可以有多種類型,一種類型可以有很多書。 作者被聲明為 ForeignKey ,所以每本書只有一個(gè)作者,但作者可能有很多書(實(shí)際上一本書可能有多個(gè)作者,但不是在這個(gè)實(shí)現(xiàn)!

在兩種字段類型中,相關(guān)模型類都使用模型類或包含相關(guān)模型名稱的字符串聲明為第一個(gè)未命名參數(shù)。 如果在引用之前尚未在此文件中定義關(guān)聯(lián)類,則必須將模型的名稱用作字符串! author 字段中感興趣的其他參數(shù)是 null = True ,如果未選擇作者,則允許數(shù)據(jù)庫存儲(chǔ) Null on_delete = models.SET_NULL ,如果關(guān)聯(lián)的作者記錄被刪除,它將設(shè)置作者的值為 Null 。

該模型還定義 __ str __(),使用書的 title 字段表示 Book 記錄。 最后一個(gè)方法, get_absolute_url()返回一個(gè)URL,可以用來訪問這個(gè)模型的詳細(xì)記錄(為了這個(gè)工作,我們需要定義一個(gè)URL映射,名字為 book -detail ,并定義關(guān)聯(lián)的視圖和模板)。

BookInstance模型

接下來,復(fù)制其他模型下的 BookInstance 模型(如下所示)。 BookInstance 表示某人可能借用的書的特定副本,并且包括關(guān)于副本是否可用的信息,或者預(yù)期返回什么日期,"印記"或版本詳細(xì)信息,以及唯一ID 為圖書館的書。

現(xiàn)在一些領(lǐng)域和方法將是熟悉的。 模型使用

  • ForeignKey to identify the associated Book (each book can have many copies, but a copy can only have one Book).
  • CharField to represent the imprint (specific release) of the book.
import uuid # Required for unique book instances

class BookInstance(models.Model):
    """
    Model representing a specific copy of a book (i.e. that can be borrowed from the library).
    """
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="Unique ID for this particular book across whole library")
    book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True) 
    imprint = models.CharField(max_length=200)
    due_back = models.DateField(null=True, blank=True)

    LOAN_STATUS = (
        ('d', 'Maintenance'),
        ('o', 'On loan'),
        ('a', 'Available'),
        ('r', 'Reserved'),
    )

    status = models.CharField(max_length=1, choices=LOAN_STATUS, blank=True, default='d', help_text='Book availability')

    class Meta:
        ordering = ["due_back"]
        

    def __str__(self):
        """
        String for representing the Model object
        """
        return '%s (%s)' % (self.id,self.book.title)

我們另外聲明幾種新類型的字段:

  • UUIDField is used for the id field to set it as the primary_key for this model. This type of field allocates a globally unique value for each instance (one for every book you can find in the library).
  • DateField is used for the due_back date (at which the book is expected to come available after being borrowed or in maintenance). This value can be blank or null (needed for when the book is available). The model metadata (Class Meta) uses this field to order records when they are returned in a query.
  • status is a CharField that defines a choice/selection list. As you can see, we define a tuple containing tuples of key-value pairs and pass it to the choices argument. The value in a key/value pair is a display value that a user can select, while the keys are the values that are actually saved if the option is selected. We've also set a default value of 'd' (maintenance) as books will initially be created unavailable before they are stocked on the shelves.

模型 __ str __()表示使用其唯一ID和相關(guān)聯(lián)的 Book 標(biāo)題的組合的 BookInstance 對(duì)象。

注意:一點(diǎn)Python:

  • The value returned by __str__() is a formatted string. Within the string we use %s to declare "placeholders'. After the string we specify % and then a tuple containing the values to be inserted in the placeholders. If you just have one placeholder then you can omit the tuple - e.g. 'My value: %s' % variable

作者模型

復(fù)制 models.py 中現(xiàn)有代碼下的作者模型(如下所示)。

所有的字段/方法現(xiàn)在應(yīng)該是熟悉的。 該模型定義作者具有名字,姓氏,出生日期和(可選)死亡日期。 它指定默認(rèn)情況下 __ str __()返回姓氏, firstname 順序中的名稱。 get_absolute_url()方法反轉(zhuǎn) author-detail URL映射,以獲取顯示單個(gè)作者的URL。

class Author(models.Model):
? ? """
? ? Model representing an author.
? ? """
? ? first_name = models.CharField(max_length=100)
? ? last_name = models.CharField(max_length=100)
? ? date_of_birth = models.DateField(null=True, blank=True)
? ? date_of_death = models.DateField('Died', null=True, blank=True)
? ??
? ? def get_absolute_url(self):
? ? ? ? """
? ? ? ? Returns the url to access a particular author instance.
? ? ? ? """
? ? ? ? return reverse('author-detail', args=[str(self.id)])
? ??

? ? def __str__(self):
? ? ? ? """
? ? ? ? String for representing the Model object.
? ? ? ? """
? ? ? ? return '%s, %s' % (self.last_name, self.first_name)

重新運(yùn)行數(shù)據(jù)庫遷移

所有的模型現(xiàn)在已經(jīng)創(chuàng)建。 現(xiàn)在重新運(yùn)行數(shù)據(jù)庫遷移,將它們添加到數(shù)據(jù)庫中。

python3 manage.py makemigrations
python3 manage.py migrate

語言模型 - 挑戰(zhàn)

想象一下,一個(gè)地方捐贈(zèng)者捐贈(zèng)了一些用另一種語言寫的新書(比如說,波斯語)。 挑戰(zhàn)是如何在我們的圖書館網(wǎng)站中最好地展示這些,然后將它們添加到模型中。

有些事情要考慮:

  • Should "language" be associated with a Book, BookInstance, or some other object?
  • Should the different languages be represented using model, a free text field, or a hard-coded selection list?

確定后,添加字段。 您可以查看我們?cè)贕ithub上決定的此處

      概要

      在本文中,我們了解了如何定義模型,然后使用此信息為 LocalLibrary 網(wǎng)站設(shè)計(jì)和實(shí)施適當(dāng)?shù)哪P汀?/span>

      此時(shí),我們將暫時(shí)從創(chuàng)建網(wǎng)站中轉(zhuǎn)移,并查看 Django管理網(wǎng)站。 這個(gè)網(wǎng)站將允許我們向庫中添加一些數(shù)據(jù),然后我們可以使用我們的(尚未創(chuàng)建的)視圖和模板來顯示。

      也可以看看

      以上內(nèi)容是否對(duì)您有幫助:
      在線筆記
      App下載
      App下載

      掃描二維碼

      下載編程獅App

      公眾號(hào)
      微信公眾號(hào)

      編程獅公眾號(hào)