Django中Model的使用方法教程
前言
本文主要給大家介紹了關(guān)于Django中Model使用的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
創(chuàng)建模型
使用Django的模型主要注意兩個(gè)方面:字段的類型和方法的重寫(xiě)。這里用一個(gè)例子來(lái)說(shuō)明,其中包含了常用的字段類型和如何重寫(xiě)方法。
from django.db import models class School(models.Model): pass class Message(models.Model): pass class Teacher(models.Model): pass class Student(models.Model): GENDER_CHOICES = ( ('male', "男"), ('female', "女"), ('secret', "保密") ) name = models.CharField(max_length=40, blank=True, verbose_name="姓名") gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default="secret", verbose_name="性別") age = models.IntegerField(default=0, verbose_name="年齡") rank = models.PositiveIntegerField(default=1, verbose_name="排名", unique=True) discount = models.DecimalField(max_digits=3, decimal_places=2, verbose_name="折扣", default=1.0) school = models.ForeignKey(to=School, verbose_name="學(xué)校", on_delete=models.CASCADE) message = models.OneToOneField(to=Message, verbose_name="信息", on_delete=models.CASCADE) teacher = models.ManyToManyField(verbose_name="老師", to=Teacher, blank=True) introduce = models.TextField(blank=True, verbose_name="介紹") grade = models.FloatField(default=0.0, verbose_name="成績(jī)") url = models.URLField(verbose_name="個(gè)人主頁(yè)", max_length=100) email = models.EmailField(verbose_name="郵箱") image = models.ImageField(upload_to='img/%Y/%m/%d/', verbose_name='上傳圖片', null=True) file = models.FileField(upload_to="file/%Y/%m/%d/", verbose_name="上傳文件", blank=True) is_deleted = models.BooleanField(verbose_name="已刪除", default=False, blank=True) time_added = models.DateTimeField(verbose_name="添加時(shí)間", auto_now_add=True, blank=True) def delete(self, using=None, keep_parents=False): self.is_deleted = True # some actions self.save() def save(self, force_insert=False, force_update=False, using=None, update_fields=None): # some actions self.name = self.name.capitalize() # 首字母大寫(xiě) return super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields) def __repr__(self): return "UserProfile:{}".format(self.name) def __str__(self): return self.name class Meta: ordering = ['-time_added'] verbose_name = "用戶信息" verbose_name_plural = verbose_name db_table = "student_info"
字段類型
這里對(duì)常見(jiàn)字段中值得注意的地方作一下說(shuō)明。
CharField
字符串類型值得注意的是當(dāng)該字段只能在是某些指定的值時(shí),要使用choices參數(shù)來(lái)指向預(yù)先設(shè)定的值。
IntergerField & PositiveIntegerField
整數(shù)類型和正整數(shù)類型。
DecimalField
十進(jìn)制浮點(diǎn)數(shù),其中,參數(shù)max_digits代表數(shù)字有多少位,decimal_places代表小數(shù)部分有多少位。
ForeignKey
使用to指向被關(guān)聯(lián)的模型,使用on_delete來(lái)規(guī)定被關(guān)聯(lián)對(duì)象刪除時(shí)該對(duì)象的處理方式。主要有兩種取值,models.CASCADE和models.SET_NULL。models.CASCADE表示當(dāng)被關(guān)聯(lián)對(duì)象刪除時(shí)刪除該對(duì)象,models.SET_NULL表示當(dāng)被關(guān)聯(lián)對(duì)象被刪除時(shí)將該對(duì)象設(shè)置為空,此設(shè)置的前提是該字段要允許為空。
ImageField & FileField
使用upload_to參數(shù)來(lái)指定文件保存的路徑。注意,該路徑前面再加上 MEDIA_ROOT中設(shè)置的路徑就是上傳的文件真實(shí)保存路徑了,如 MEDIA_ROOT的路徑是'/home/media',那圖片上傳的路徑就類似/home/media/img/2018/03/06。
BooleanField
布爾類型,可以使用default指定默認(rèn)值。
DateTimeField
在Django中,代表時(shí)間字段的有三種:DateTimeField、DateField、TimeField,三種類型分別對(duì)應(yīng)datetime()、date()、time(),都有auto_now和auto_now_add參數(shù)。
- auto_now
默認(rèn)值為False,設(shè)置為T(mén)rue時(shí)會(huì)在每次修改該對(duì)象時(shí)自動(dòng)更新為當(dāng)前時(shí)間,但是無(wú)法手動(dòng)修改該字段的值。 - auto_now_add
默認(rèn)值為False,設(shè)置為T(mén)rue時(shí)會(huì)在創(chuàng)建對(duì)象時(shí)自動(dòng)設(shè)置為當(dāng)前時(shí)間,之后都不再修改,也不能手動(dòng)修改其值。 - 默認(rèn)當(dāng)前時(shí)間,又能修改
有時(shí)候我們需要在創(chuàng)建對(duì)象時(shí)設(shè)置字段的值為當(dāng)前時(shí)間,在后續(xù)時(shí)又能修改,使用auto_now或者auto_now_add都無(wú)法實(shí)現(xiàn)這一點(diǎn)。此時(shí),可以使用default參數(shù)來(lái)設(shè)置默認(rèn)值,如下
from django.db import models from django.utils import timezone class Message(models.Model): add_date = models.DateTimeField(verbose_name='保存日期',default = timezone.now) mod_date = models.DateTimeField(verbose_name='最后修改日期', auto_now = True)
重寫(xiě)方法
delete
Django默認(rèn)的刪除是將數(shù)據(jù)從數(shù)據(jù)庫(kù)里刪除,有時(shí)候我們需要軟刪除,保存以前的數(shù)據(jù),這時(shí)候我們可以使用一個(gè)布爾類型的字段標(biāo)識(shí)該條數(shù)據(jù)是否刪除,這時(shí)需要重寫(xiě)delete方法實(shí)現(xiàn)軟刪除。
在delete方法中將is_deleted的值設(shè)置為T(mén)rue,表示該條數(shù)據(jù)已刪除。此外還可以執(zhí)行一些關(guān)聯(lián)的動(dòng)作,比如對(duì)相關(guān)字段賦值等,最后保存對(duì)象。
save
重寫(xiě)save方法可以讓我們?cè)诒4鏀?shù)據(jù)時(shí)做一些相關(guān)的操作,比如保存姓名時(shí)自動(dòng)設(shè)置為首字母大寫(xiě),執(zhí)行完之后需要調(diào)用父類的save方法進(jìn)行保存。
repr & str
兩者的作用是將變量或者常量轉(zhuǎn)換為字符串對(duì)象,這里重寫(xiě)該方法使得對(duì)象實(shí)例能被轉(zhuǎn)化為字符串。
class Meta
- ordering:結(jié)果集按照何種方式排序,上面例子表示按添加時(shí)間的逆序排序
- verbose_name:對(duì)象的名稱
- verbose_name_plural:對(duì)象復(fù)數(shù)形式的名稱
- db_table:在數(shù)據(jù)庫(kù)中的表名
常用方法
在對(duì)常用方法介紹部分,由于上面的模型包含字段較多,所以不使用上面創(chuàng)建的模型。這里使用一些常見(jiàn)的模型,通過(guò)名字就可以知道代表的內(nèi)容,因此就不列出模型了。
創(chuàng)建實(shí)例
create
使用create方法可以創(chuàng)建一個(gè)模型實(shí)例,將各字段在參數(shù)中設(shè)置各個(gè)字段的值。
student = Student.objects.create(name='zhangsan', gender='male')
get_or_create
get_or_create的作用是查詢一個(gè)實(shí)例,當(dāng)實(shí)例不存在時(shí)則創(chuàng)建一個(gè)實(shí)例。
obj, created = Person.objects.get_or_create( first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}, )
函數(shù)返回一個(gè)(object, created)的tuple,object是查詢或者創(chuàng)建的對(duì)象實(shí)例,created是個(gè)布爾類型的值,表示是否是新創(chuàng)建的實(shí)例。在查詢時(shí)使用defaults以外的參數(shù)進(jìn)行查詢,當(dāng)實(shí)例不存在時(shí)將包含default參數(shù)一起創(chuàng)建一個(gè)新的實(shí)例。功能類似于如下代碼:
try: obj = Person.objects.get(first_name='John', last_name='Lennon') except Person.DoesNotExist: obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9)) obj.save()
update_or_create
update_or_create的作用是更新一個(gè)實(shí)例,當(dāng)實(shí)力不存在時(shí)則創(chuàng)建一個(gè)實(shí)例。
obj, created = Person.objects.update_or_create( first_name='John', last_name='Lennon', defaults={'first_name': 'Bob'}, )
函數(shù)返回一個(gè)(object, created)的tuple,object是更新或者創(chuàng)建的對(duì)象實(shí)例,created是個(gè)布爾類型的值,表示是否是新創(chuàng)建的實(shí)例。在查詢的對(duì)象實(shí)例存在時(shí),使用default中的參數(shù)進(jìn)行更新,當(dāng)實(shí)例不存在時(shí),創(chuàng)建新的對(duì)象實(shí)例,需要更新的字段的值設(shè)置為default中的值。功能類似:
defaults = {'first_name': 'Bob'} try: obj = Person.objects.get(first_name='John', last_name='Lennon') for key, value in defaults.items(): setattr(obj, key, value) obj.save() except Person.DoesNotExist: new_values = {'first_name': 'John', 'last_name': 'Lennon'} new_values.update(defaults) obj = Person(**new_values) obj.save()
add
這里補(bǔ)充一下add方法,add用在多對(duì)多的關(guān)系模型上,表示添加該字段的指向?qū)ο蟆?/p>
>>> 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)
上面的Author表示作者模型,entry表示書(shū)籍條目,一本書(shū)可以有多個(gè)作者,采用多對(duì)多關(guān)系。add可以為書(shū)的實(shí)例添加多個(gè)作者。
查詢
all
all方法查詢?cè)搶?duì)象的所有實(shí)例。
all_entries = Entry.objects.all()
get
使用get查詢實(shí)例,當(dāng)實(shí)例不存在時(shí)會(huì)返回一個(gè)不存在異常。
>>> entry = Entry.objects.get(pk=1) >>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
filter
filter返回一個(gè)QuerySet,而不是對(duì)象實(shí)例,當(dāng)查詢結(jié)果不存在時(shí)返回空的QuerySet,而不是返回一場(chǎng),可以對(duì)結(jié)果集作切片操作來(lái)獲取實(shí)例內(nèi)容。下面代碼功能在有對(duì)象實(shí)例時(shí)等同于上面get的操作。
>>> entry = Entry.objects.filter(pk=1)[0] >>> cheese_blog = Blog.objects.filter(name="Cheddar Talk")[0]
filter結(jié)果可以鏈?zhǔn)降剡M(jìn)行操作,也就是后面可以接多個(gè)過(guò)濾條件。
Entry.objects.filter(pub_date__year=2006) Entry.objects.all().filter(pub_date__year=2006) Entry.objects.filter(blog__name__year="zhangsan")
上面的pub_date__year表示取出DateField類型的pub_date的年,類似的可以取出月__month,日__day。在使用外鍵ForeignKey時(shí)可以使用雙下劃線來(lái)表示被關(guān)聯(lián)對(duì)象的字段。
現(xiàn)在來(lái)看一下鏈?zhǔn)竭^(guò)濾的例子。
Entry.objects.filter( ... headline__startswith='What' ... ).exclude( ... pub_date__gte=datetime.date.today() ... ).filter( ... pub_date__gte=datetime.date(2005, 1, 30) ... )
首先使用__startswith過(guò)濾標(biāo)題以'What'開(kāi)始的數(shù)據(jù)。然后保留讓發(fā)布日期小于今天的數(shù)據(jù),exclude表示排除條件內(nèi)的那部分?jǐn)?shù)據(jù),條件使用了__gte表示大于當(dāng)前日期,該部分過(guò)濾類似于filter后面使用__lte小于。最后也是使用__gte大于一個(gè)自定義的日期。
除了上面的過(guò)濾條件外,常見(jiàn)的還有__icontains,表示包含該內(nèi)容。
Q
Q是Django自帶的內(nèi)容,用于查詢。主要的用途是在頁(yè)面的搜索框中輸入內(nèi)容后臺(tái)查詢相應(yīng)的數(shù)據(jù)集。
student = student.filter(Q(name__icontains=search) | Q(teacher__name__icontains=search) | Q(gender__icontains=search) | Q(url__icontains=search))
上述例子常用在一個(gè)搜索框可能搜索多個(gè)字段的內(nèi)容時(shí),各個(gè)過(guò)濾條件之間使用“|”進(jìn)行或者運(yùn)算。當(dāng)多條件查詢時(shí),各個(gè)條件是并運(yùn)算,使用“&”代替“|”。
Q可以復(fù)制給個(gè)變量,有時(shí)候我們需要對(duì)Q后面的內(nèi)容先做一些處理,如將日期拼湊出來(lái)等,這時(shí)候可以先把Q賦值給一個(gè)變量,然后對(duì)變量進(jìn)行“|”或者“&”操作。
query = Q(name__icontains=search) query = query | Q(teacher__name__icontains=search) student = student.filter(query)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- django框架model orM使用字典作為參數(shù),保存數(shù)據(jù)的方法分析
- django模型中的字段和model名顯示為中文小技巧分享
- django模型層(model)進(jìn)行建表、查詢與刪除的基礎(chǔ)教程
- Django中的Model操作表的實(shí)現(xiàn)
- Pycharm 操作Django Model的簡(jiǎn)單運(yùn)用方法
- Django項(xiàng)目中model的數(shù)據(jù)處理以及頁(yè)面交互方法
- Django基礎(chǔ)之Model操作步驟(介紹)
- Django 根據(jù)數(shù)據(jù)模型models創(chuàng)建數(shù)據(jù)表的實(shí)例
- 基于Django的ModelForm組件(詳解)
- django 將model轉(zhuǎn)換為字典的方法示例
- Django model序列化為json的方法示例
- Python Web框架之Django框架Model基礎(chǔ)詳解
相關(guān)文章
利用python實(shí)時(shí)刷新基金估值效果(摸魚(yú)小工具)
這篇文章主要介紹了利用python實(shí)時(shí)刷新基金估值(摸魚(yú)小工具),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09python使用正則表達(dá)式去除中文文本多余空格,保留英文之間空格方法詳解
這篇文章主要介紹了python使用正則表達(dá)式去除中文文本多余空格,保留英文之間空格方法詳解,需要的朋友可以參考下2020-02-02基于Python編寫(xiě)將文本轉(zhuǎn)換為語(yǔ)音的簡(jiǎn)易應(yīng)用
這篇文章主要介紹了如何使用Python編寫(xiě)一個(gè)簡(jiǎn)單的應(yīng)用程序,將文本轉(zhuǎn)換為語(yǔ)音,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2023-08-08Python跳出循環(huán)語(yǔ)句continue與break的區(qū)別
這篇文章主要介紹了Python跳出循環(huán)語(yǔ)句continue與break的區(qū)別,本文用實(shí)例來(lái)說(shuō)明它們之間的區(qū)別,簡(jiǎn)單易記易懂,需要的朋友可以參考下2014-08-08如何使用VSCode愉快的寫(xiě)Python于調(diào)試配置步驟
從我的使用經(jīng)驗(yàn)出發(fā),可以說(shuō)VSCode用來(lái)寫(xiě)Python真的是再合適不過(guò)了,你將體驗(yàn)到絲滑的編程體驗(yàn)和無(wú)限擴(kuò)展的可能。而且,如果你的項(xiàng)目是包含多種語(yǔ)言的,比如Web開(kāi)發(fā),你不必再開(kāi)多個(gè)編輯器和其他工具,因?yàn)檫@一切都可以在VSCode里完成了2018-04-04python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽機(jī)制、自定義信號(hào)基礎(chǔ)介紹
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽機(jī)制基礎(chǔ)介紹,需要的朋友可以參考下2020-02-02Pytorch GPU內(nèi)存占用很高,但是利用率很低如何解決
這篇文章主要介紹了Pytorch GPU內(nèi)存占用很高,但是利用率很低的原因及解決方法,具有很好的參考價(jià)值,希望對(duì)大家 有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Python寫(xiě)的英文字符大小寫(xiě)轉(zhuǎn)換代碼示例
這篇文章主要介紹了Python寫(xiě)的英文字符大小寫(xiě)轉(zhuǎn)換代碼示例,本文例子相對(duì)簡(jiǎn)單,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-03-03python 多線程對(duì)post請(qǐng)求服務(wù)器測(cè)試并發(fā)的方法
今天小編就為大家分享一篇python 多線程對(duì)post請(qǐng)求服務(wù)器測(cè)試并發(fā)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06