網(wǎng)站推廣目標(biāo)是什么seo整站排名
Model
Model (模型) 簡(jiǎn)而言之即數(shù)據(jù)模型,是一個(gè)Django應(yīng)用的核心。模型不是數(shù)據(jù)本身(比如數(shù)據(jù)表里的數(shù)據(jù)), 而是抽象的描述數(shù)據(jù)的構(gòu)成和邏輯關(guān)系。
每個(gè)Django的模型(model)實(shí)際上是個(gè)類,繼承了models.Model。每個(gè)Model應(yīng)該包括屬性(字段),關(guān)系(比如單對(duì)單,單對(duì)多和多對(duì)多)和方法。當(dāng)你定義好Model模型后,Django的接口會(huì)自動(dòng)幫你在數(shù)據(jù)庫生成相應(yīng)的數(shù)據(jù)表(table)。
模型的組成
一個(gè)標(biāo)準(zhǔn)的Django模型分別由模型字段、META選項(xiàng)和方法三部分組成。我們接下來對(duì)各部分進(jìn)行詳細(xì)介紹。Django官方編碼規(guī)范建議按如下方式排列:
- 定義的模型字段:包括基礎(chǔ)字段和關(guān)系字段
- 自定義的Manager方法:改變模型
- class Meta選項(xiàng): 包括排序、索引等等(可選)。
- def str():定義單個(gè)模型實(shí)例對(duì)象的名字(可選)。
- def save():重寫save方法(可選)。
- def get_absolute_url():為單個(gè)模型實(shí)例對(duì)象生成獨(dú)一無二的url(可選)
- 其它自定義的方法
模型的字段
models.Model提供的常用模型字段包括基礎(chǔ)字段和關(guān)系字段。
基礎(chǔ)字段
CharField()
from django.db import modelsclass MyModel(models.Model):my_char_field = models.CharField(max_length=100)
- max_length:必填參數(shù),用于限定字段可以存儲(chǔ)的字符的最大長(zhǎng)度。
- blank:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則該字段允許為空。
- null:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則 Django 在數(shù)據(jù)庫中使用 NULL 來存儲(chǔ)空值。
- default:字段的默認(rèn)值。
- editable:布爾值,默認(rèn)為 True。如果設(shè)置為 False,這個(gè)字段將不會(huì)在 Django 管理界面或者任何 ModelForm 中顯示。
- help_text:用于在表單字段旁邊顯示額外的幫助文本。
- verbose_name:為字段設(shè)置一個(gè)人類可讀的名字。
TextField()
from django.db import modelsclass MyModel(models.Model):my_text_field = models.TextField()
- 適合大量文本,max_length = xxx選項(xiàng)可選。
- blank:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則該字段允許為空。
- null:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則 Django 在數(shù)據(jù)庫中使用 NULL 來存儲(chǔ)空值。
- default:字段的默認(rèn)值。
- editable:布爾值,默認(rèn)為 True。如果設(shè)置為 False,這個(gè)字段將不會(huì)在 Django 管理界面或者任何 ModelForm 中顯示。
- help_text:用于在表單字段旁邊顯示額外的幫助文本。
- verbose_name:為字段設(shè)置一個(gè)人類可讀的名字。
DateField() 和DateTimeField()
from django.db import modelsclass MyModel(models.Model):my_date_field = models.DateField()
-
DateField 用于存儲(chǔ)日期,不包括時(shí)間
-
可通過default=xx選項(xiàng)設(shè)置默認(rèn)日期和時(shí)間。
-
對(duì)于DateTimeField: default=timezone.now - 先要from django.utils import timezone
-
如果希望自動(dòng)記錄一次修改日期(modified),可以設(shè)置: auto_now=True
-
如果希望自動(dòng)記錄創(chuàng)建日期(created),可以設(shè)置auto_now_add=True
-
auto_now_add:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則當(dāng)對(duì)象首次被創(chuàng)建時(shí),字段會(huì)被設(shè)置為當(dāng)前日期。
-
auto_now:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則每次對(duì)象保存時(shí),字段會(huì)被設(shè)置為當(dāng)前日期。
-
blank:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則該字段允許為空。
-
null:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則 Django 在數(shù)據(jù)庫中使用 NULL 來存儲(chǔ)空值。
-
default:字段的默認(rèn)值。這可以是一個(gè)日期值,或者一個(gè)返回日期值的可調(diào)用對(duì)象。
-
editable:布爾值,默認(rèn)為 True。如果設(shè)置為 False,這個(gè)字段將不會(huì)在 Django 管理界面或者任何 ModelForm 中顯示。
-
help_text:用于在表單字段旁邊顯示額外的幫助文本。
-
verbose_name:為字段設(shè)置一個(gè)人類可讀的名字。
EmailField()
- 如不是必填項(xiàng),可設(shè)置blank = True和default = ‘。一般Email用于用戶名應(yīng)該是唯一的,建議設(shè)置unique = True
- max_length:用于限定字段可以存儲(chǔ)的字符的最大長(zhǎng)度。默認(rèn)值為 254,這是因?yàn)檫@是標(biāo)準(zhǔn)電子郵件地址的最大長(zhǎng)度。
- blank:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則該字段允許為空。
- null:布爾值,默認(rèn)為 False。如果設(shè)置為 True,則 Django 在數(shù)據(jù)庫中使用 NULL 來存儲(chǔ)空值。
- default:字段的默認(rèn)值。
- editable:布爾值,默認(rèn)為 True。如果設(shè)置為 False,這個(gè)字段將不會(huì)在 Django 管理界面或者任何 ModelForm 中顯示。
- help_text:用于在表單字段旁邊顯示額外的幫助文本。
- verbose_name:為字段設(shè)置一個(gè)人類可讀的名字
IntegerField()
- IntegerField 是一個(gè)用于存儲(chǔ)整數(shù)的字段。
- 它適用于那些需要存儲(chǔ)整數(shù)的地方,比如年齡、數(shù)量等。
- 在數(shù)據(jù)庫層面,通常對(duì)應(yīng)于整數(shù)類型。
SlugField()
- SlugField 是一個(gè)用于存儲(chǔ)“slug”的字符串字段,通常用于URLs。
- “Slug”是一個(gè)短標(biāo)簽,通常只包含字母、數(shù)字、下劃線或連字符,用于提高URL的可讀性。
- 它默認(rèn)最大長(zhǎng)度為50個(gè)字符,并且可以用max_length參數(shù)自定義。
- 通常,SlugField會(huì)有一個(gè)unique_for_date參數(shù),用于確保在給定日期范圍內(nèi)slug的唯一性。
URLField()
- URLField 是一個(gè)用于存儲(chǔ)URL的字符串字段。
- 它默認(rèn)最大長(zhǎng)度為200個(gè)字符,也可以用max_length參數(shù)自定義。
- 在數(shù)據(jù)庫層面,它通常對(duì)應(yīng)于一個(gè)VARCHAR字段。
BooleanField()
- BooleanField 是一個(gè)用于存儲(chǔ)布爾值(True/False)的字段。
- 它通常用于表示“是/否”或“開/關(guān)”這樣的二值狀態(tài)。
- 在數(shù)據(jù)庫層面,通常對(duì)應(yīng)于一個(gè)布爾類型。
FileField()
FileField(upload_to=None, max_length=100) - 文件字段
-
upload_to = “/some folder/”:上傳文件夾路徑
-
max_length = xxxx:文件最大長(zhǎng)度
ImageField()
ImageField (upload_to=None, max_length=100,)- 圖片字段
- upload_to = “/some folder/”: 指定上傳圖片路徑
關(guān)系字段
OneToOneField()
OneToOneField(to, on_delete=xxx, options) - 單對(duì)單關(guān)系
-
to必需指向其他模型
-
必需指定on_delete選項(xiàng)(刪除選項(xiàng)): i.e, “on_delete =
-
models.CASCADE” or “on_delete = models.SET_NULL” .
-
可以設(shè)置 “related_name = xxx” 便于反向查詢。
ForeignKey()
ForeignKey(to, on_delete=xxx, options) - 單對(duì)多關(guān)系
-
to必需指向其他模型.
-
必需指定on_delete選項(xiàng)(刪除選項(xiàng)): i.e, “on_delete = models.CASCADE” or “on_delete = models.SET_NULL” .
-
可以設(shè)置”default = xxx” or “null = True” ;
-
如果有必要,可以設(shè)置 “l(fā)imit_choices_to = “,
-
可以設(shè)置 “related_name = xxx” 便于反向查詢。
ManyToManyField()
ManyToManyField(to, options) - 多對(duì)多關(guān)系
- to 必需指向其他模型,比如 User or ‘self’ .
- 設(shè)置 “symmetrical = False “ 表示多對(duì)多關(guān)系不是對(duì)稱的,比如A關(guān)注B不代表B關(guān)注A
- 設(shè)置 “through = ‘intermediary model’ “ 如果需要建立中間模型來搜集更多信息。
- 可以設(shè)置 “related_name = xxx” 便于反向查詢。
對(duì)于OneToOneField和ForeignKey, on_delete選項(xiàng)和related_name是兩個(gè)非常重要的設(shè)置,前者決定了了關(guān)聯(lián)外鍵刪除方式,后者決定了模型反向查詢的名字。
on_delete刪除選項(xiàng)
Django提供了如下幾種關(guān)聯(lián)外鍵刪除選項(xiàng), 可以根據(jù)實(shí)際需求使用。
- CASCADE:級(jí)聯(lián)刪除。當(dāng)你刪除publisher記錄時(shí),與之關(guān)聯(lián)的所有都會(huì)被刪除。
- PROTECT: 保護(hù)模式。如果有外鍵關(guān)聯(lián),就不允許刪除,刪除的時(shí)候會(huì)拋出ProtectedError錯(cuò)誤,除非先把關(guān)聯(lián)了外鍵的記錄刪除掉。
- SET_NULL: 置空模式。刪除的時(shí)候,外鍵字段會(huì)被設(shè)置為空。
- SET_DEFAULT: 置默認(rèn)值,刪除的時(shí)候,外鍵字段設(shè)置為默認(rèn)值。
- SET(): 自定義一個(gè)值。
- DO_NOTHING:什么也不做。刪除不報(bào)任何錯(cuò),外鍵值依然保留,但是無法用這個(gè)外鍵去做查詢
related_name選項(xiàng)
- related_name 選項(xiàng)用于指定從相關(guān)模型反向引用時(shí)的名稱。這個(gè)選項(xiàng)允許你從一個(gè)關(guān)系的“另一邊”引用對(duì)象,而不必直接通過模型的字段名。
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
在這個(gè)例子中,Book 模型有一個(gè)指向 Author 模型的 ForeignKey。通過設(shè)置 related_name=‘books’,我們可以在 Author 實(shí)例上使用 books 屬性來獲取所有與之相關(guān)的 Book 實(shí)例。
重要特性
如果沒有指定 related_name,Django 會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的名稱,格式為 <model_name>_set,其中 <model_name> 是關(guān)系的另一端的模型的小寫名稱(例如,如果 Book 模型有一個(gè)指向 Author 的 ForeignKey,默認(rèn)的 related_name 將是 book_set)。
如果你的模型被用于多個(gè) ForeignKey 或 ManyToManyField,為每個(gè)關(guān)系指定一個(gè)唯一的 related_name 是一個(gè)好的實(shí)踐,這樣可以避免命名沖突。
如果你不希望為關(guān)系創(chuàng)建反向名稱,可以將 related_name 設(shè)置為 ‘+’ 或者 None(在 Django 1.9 及以后版本中)。
示例
class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='publications')class Article(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles')
在這個(gè)例子中,Author 可以通過 publications 屬性獲取其所有的 Book 實(shí)例,通過 articles 屬性獲取其所有的 Article 實(shí)例。
使用 related_name:
author = Author.objects.get(name="Jane Doe")
author_books = author.publications.all() # 獲取所有與Jane Doe相關(guān)的書籍
author_articles = author.articles.all() # 獲取所有與Jane Doe相關(guān)的文章
如果不使用 related_name:
author_books = Book.objects.filter(author=author) # 使用默認(rèn)的related_name
author_articles = Article.objects.filter(author=author) # 使用默認(rèn)的related_name
模型的META選項(xiàng)
在 Django 中,每個(gè)模型都有一個(gè)內(nèi)部類叫做 Meta,它用于包含模型的元數(shù)據(jù),即關(guān)于模型自身的配置信息。這些元數(shù)據(jù)不會(huì)直接轉(zhuǎn)換為數(shù)據(jù)庫字段,但它們會(huì)影響模型的行為,尤其是在數(shù)據(jù)庫層面和 Django 管理界面中的表現(xiàn)。
以下是一些常用的 Meta 選項(xiàng)及其用途:
abstract
類型:布爾值
默認(rèn)值:False
用途:如果設(shè)置為 True,則模型會(huì)被視為抽象基類,不會(huì)創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)庫表。
app_label
類型:字符串
用途:指定模型所屬的應(yīng)用的名稱。通常不需要設(shè)置,因?yàn)?Django 會(huì)自動(dòng)確定。
db_table
類型:字符串
用途:指定模型在數(shù)據(jù)庫中對(duì)應(yīng)的表名。如果不設(shè)置,Django 會(huì)自動(dòng)生成表名,格式為 <app_label>_<model_name>。
db_tablespace
類型:字符串
用途:指定模型使用的數(shù)據(jù)庫表空間。如果數(shù)據(jù)庫支持表空間,這個(gè)選項(xiàng)可以用來指定模型表應(yīng)該使用的表空間。
get_latest_by
類型:字符串或字段名
用途:指定一個(gè)字段名,通常是日期或時(shí)間字段,以便使用 Model.objects.latest() 方法時(shí)按照該字段排序獲取最新記錄。
managed
類型:布爾值
默認(rèn)值:True
用途:如果設(shè)置為 False,Django 不會(huì)為該模型創(chuàng)建或刪除數(shù)據(jù)庫表。這在模型映射到預(yù)先存在的數(shù)據(jù)庫表或是在非數(shù)據(jù)庫數(shù)據(jù)源上時(shí)很有用。
order_with_respect_to
類型:字段名
用途:用于多對(duì)多關(guān)系,允許對(duì)象根據(jù)指定的字段進(jìn)行排序。
ordering
類型:字符串或字段列表
用途:指定對(duì)象默認(rèn)的排序方式。例如,[‘name’] 表示按照 name 字段的升序排序。
permissions
類型:二元組列表
用途:為模型添加額外的權(quán)限。每個(gè)元組應(yīng)該包含兩個(gè)元素:權(quán)限代碼和人類可讀的權(quán)限名稱。
proxy
類型:布爾值
默認(rèn)值:False
用途:如果設(shè)置為 True,則模型會(huì)被視為代理模型。它將繼承其父模型的字段,但不會(huì)創(chuàng)建新的數(shù)據(jù)庫表。
unique_together
類型:字段名列表的列表
用途:指定字段組合的唯一性約束。例如,unique_together = [(‘username’, ‘email’)] 表示 username 和 email 的組合必須是唯一的。
verbose_name
類型:字符串
用途:為模型設(shè)置一個(gè)人類可讀的單數(shù)名稱。
verbose_name_plural
類型:字符串
用途:為模型的復(fù)數(shù)名稱設(shè)置一個(gè)人類可讀的名稱。
以下是一個(gè)包含 Meta 類的模型示例:
from django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=50)last_name = models.CharField(max_length=50)class Meta:ordering = ['last_name']verbose_name_plural = "people"
模型的方法
在 Django 中,模型不僅僅是數(shù)據(jù)庫表的簡(jiǎn)單映射;它們也是具有行為的 Python 對(duì)象。你可以為模型添加自定義的方法來執(zhí)行各種操作,比如計(jì)算字段值、處理相關(guān)對(duì)象,或者執(zhí)行任何其他需要的業(yè)務(wù)邏輯。
以下是一些常見類型的模型方法及其用途:
自定義管理器方法
雖然不是直接在模型上定義的,但管理器方法是模型中經(jīng)常使用的方法。它們?cè)试S你對(duì)查詢集進(jìn)行自定義操作。
from django.db import modelsclass BookManager(models.Manager):def title_count(self, keyword):return self.filter(title__icontains=keyword).count()class Book(models.Model):title = models.CharField(max_length=100)objects = BookManager()# 使用自定義管理器方法
book_count = Book.objects.title_count('django')
自定義實(shí)例方法
這些方法通常用于處理單個(gè)模型實(shí)例。
class Author(models.Model):name = models.CharField(max_length=100)books = models.ManyToManyField(Book)# book_count 方法返回與特定作者相關(guān)的書籍?dāng)?shù)量。def book_count(self):return self.books.count()
自定義類方法
類方法與實(shí)例方法不同,因?yàn)樗鼈儾恍枰囟ǖ膶?shí)例來調(diào)用。它們可以用來返回查詢集或者執(zhí)行與特定實(shí)例無關(guān)的操作。
class Book(models.Model):title = models.CharField(max_length=100)published_date = models.DateField()#recent_books 類方法返回最近30天內(nèi)發(fā)布的書籍。@classmethoddef recent_books(cls):return cls.objects.filter(published_date__gte=datetime.now() - timedelta(days=30))
自定義靜態(tài)方法
靜態(tài)方法不依賴于類或?qū)嵗臓顟B(tài)。它們用于執(zhí)行一些不訪問任何屬性或方法的操作。
class Book(models.Model):title = models.CharField(max_length=100)
#is_valid_title 靜態(tài)方法檢查給定的標(biāo)題是否有效。@staticmethoddef is_valid_title(title):return len(title) > 0
保存和刪除鉤子
Django 提供了 save 和 delete 方法的鉤子,你可以在這些方法中添加自定義邏輯。
class Book(models.Model):title = models.CharField(max_length=100)def save(self, *args, **kwargs):do_something_before_save()super(Book, self).save(*args, **kwargs)do_something_after_save()def delete(self, *args, **kwargs):do_something_before_delete()super(Book, self).delete(*args, **kwargs)do_something_after_delete()
以下是一個(gè)綜合了上述方法的模型示例:
from django.db import models
from datetime import datetime, timedeltaclass Author(models.Model):name = models.CharField(max_length=100)def get_books(self):return self.book_set.all()class Book(models.Model):title = models.CharField(max_length=100)authors = models.ManyToManyField(Author)published_date = models.DateField()def was_published_recently(self):return self.published_date >= datetime.now() - timedelta(days=30)@classmethoddef get_recent_books(cls):return cls.objects.filter(published_date__gte=datetime.now() - timedelta(days=30))def save(self, *args, **kwargs):if not self.title:raise ValueError("Book must have a title.")super(Book, self).save(*args, **kwargs)