Django中model的一些細(xì)節(jié)問題總結(jié)

1.django中model跨文件的情況

在django中,在model中關(guān)聯(lián)一個(gè)其他app中的model也是可行的富雅。只要在文件的最上面導(dǎo)入model所在的文件即可。舉個(gè)簡單的例子:

from django.db import models
from geography.models import ZipCode

class Restaurant(models.Model):
  # ...
  zip_code = models.ForeignKey(
    ZipCode,
    on_delete=models.SET_NULL,
    blank=True,
    null=True,
  )

2.字段名限制

  • 1.不能是Python保留字
  • 2.不能包含連續(xù)多于一個(gè)的下劃線。

3.model的屬性和方法

一個(gè)model非常重要的屬性是管理器。如果沒有自定義管理器顷链,默認(rèn)的名字為objects.
定義自定義方法在一個(gè)model上就是在你的類上加入新的自定義功能。 然而管理器方法試圖做的是全表范圍的事情屈梁,model方法應(yīng)該在特定的model實(shí)例上執(zhí)行嗤练,舉例如下:

from django.db import models
class Person(models.Model):
  first_name = models.CharField(max_length=50)
  last_name = models.CharField(max_length=50)
  birth_date = models.DateField()
  def baby_boomer_status(self):
    "Returns the person's baby-boomer status."
    import datetime
    if self.birth_date < datetime.date(1945, 8, 1):
      return "Pre-boomer"
    elif self.birth_date < datetime.date(1965, 1, 1):
      return "Baby boomer"
    else:
       return "Post-boomer"
  def _get_full_name(self):
    "Returns the person's full name."
    return '%s %s' % (self.first_name, self.last_name)
  full_name = property(_get_full_name)

你也可以覆蓋預(yù)定義的model方法

from django.db import models
class Blog(models.Model):
  name = models.CharField(max_length=100)
  tagline = models.TextField()
  def save(self, *args, **kwargs):
   do_something()
   super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
   do_something_else()

別忘了調(diào)用超級(jí)類方法至關(guān)重要。

4.model繼承

django中有三種類型的繼承

  • 通常在讶,你只希望用父類來保持信息不至于在每個(gè)子類中都復(fù)制一遍液斜。該類不是孤立的使用翔横,所以抽象基類就是我們接下來要說的围橡。
  • 如果你想繼承一個(gè)已經(jīng)存在的類熬芜,并希望每個(gè)類都有它自己的數(shù)據(jù)庫表 Multi-table inheritance 可以實(shí)現(xiàn)。
  • 最后遮婶,如果你只想修改父類中的行為并不修改字段蝗碎,你可以使用Proxy models.

5.抽象基類

抽象基類在你想要把一些基礎(chǔ)信息放在其他多個(gè)model時(shí)就顯得非常重要了。 你可以先自己的基類并把put abstract=True 放在 Meta class中. 該類就不會(huì)再創(chuàng)建數(shù)據(jù)庫表了旗扑。取而代之蹦骑,當(dāng)該類應(yīng)用到其他model時(shí),該類的字段就會(huì)被加到其他子類中臀防。所以不能在子類中出現(xiàn)和基類字段相同的名字的字段眠菇,不然就會(huì)報(bào)錯(cuò)。舉例:

from django.db import models
class CommonInfo(models.Model):
  name = models.CharField(max_length=100)
  age = models.PositiveIntegerField()
  class Meta:
    abstract = True
class Student(CommonInfo):
  home_group = models.CharField(max_length=5)

student將會(huì)有三個(gè)字段袱衷,CommonInfo model不能當(dāng)做一個(gè)正常的django model來用捎废,因?yàn)樗且粋€(gè)抽象類,它不會(huì)產(chǎn)生一個(gè)數(shù)據(jù)庫表也沒有一個(gè)管理器致燥,不能實(shí)例化不能被直接保存登疗。

Meta類繼承
當(dāng)一個(gè)抽象基類創(chuàng)建后,django創(chuàng)建Meta內(nèi)部類作為一個(gè)屬性嫌蚤。如果子類在內(nèi)部沒有描述一個(gè)Meta 類他將繼承父類的Meta.如果子類想要擴(kuò)展父類的Meta類辐益,可以繼承它,例如:

from django.db import models
class CommonInfo(models.Model):
  # ...
  class Meta:
    abstract = True
    ordering = ['name']
class Student(CommonInfo):
  # ...
  class Meta(CommonInfo.Meta):
    db_table = 'student_info'

對(duì)于抽象基類的Meta類Django 做了一個(gè)調(diào)整:在安裝Meta屬性之前脱吱,先設(shè)置 sets abstract=False. 這意味著抽象基類的子類不會(huì)自動(dòng)變成抽象類.如果你想要子類依然是一個(gè)基類智政,記得加上 abstract=True .在抽象基類的Meta類中一些屬性沒有什么意義。比如箱蝠,db_table,因?yàn)椴豢赡芩械淖宇惗加幸粯拥拿帧?/p>

6.related_name 和 related_query_name

當(dāng)你在 ForeignKey or ManyToManyField上使用一個(gè)related_name or
related_query_name , 你必須指定一個(gè)唯一的反向名和查詢名在那個(gè)字段上续捂。在抽象基類上這樣就會(huì)導(dǎo)致一些問題垦垂。因?yàn)樵擃惿系淖侄螘?huì)被包含在子類中,這樣每次查詢屬性的值都是一樣的值牙瓢。
為了解決這個(gè)問題劫拗。當(dāng)你在抽象基類中使用related_name or related_query_name , 值應(yīng)該包含’%(app_label)s’ and ’%(class)s’.

  • ’%(class)s’ 被子類中字段名的小寫形式代替。
  • ’%(app_label)s’被子類所處的app名的小寫形式代替一罩。
    舉例:
    common/models.py:
from django.db import models
class Base(models.Model):
  m2m = models.ManyToManyField(
    OtherModel,
    related_name="%(app_label)s_%(class)s_related",
    related_query_name="%(app_label)s_%(class)ss",
  )
  class Meta:
    abstract = True
class ChildA(Base):
  pass
class ChildB(Base):
  pass

rare/models.py:

from common.models import Base
class ChildB(Base):
  pass

common.ChildA.m2m field 的逆向的名稱為 common_childa_related杨幼,逆向的查詢名為common_childas. rare.ChildB.m2m field 的逆向的名稱為 rare_childb_related, 逆向的查詢名為
rare_childbs.如果你不指定 related_name 屬性在abstract base class中, 默認(rèn)的逆向名稱為
類名稱后加_set字符串聂渊。例如,在上面的例子中, 如果 related_name attribute 省略, m2m field 逆向名稱為childa_set in the ChildA case and childb_set for the ChildB field

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市四瘫,隨后出現(xiàn)的幾起案子汉嗽,更是在濱河造成了極大的恐慌,老刑警劉巖找蜜,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饼暑,死亡現(xiàn)場離奇詭異,居然都是意外死亡洗做,警方通過查閱死者的電腦和手機(jī)弓叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诚纸,“玉大人撰筷,你說我怎么就攤上這事∑枧牵” “怎么了毕籽?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長井辆。 經(jīng)常有香客問我关筒,道長,這世上最難降的妖魔是什么杯缺? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任蒸播,我火速辦了婚禮,結(jié)果婚禮上萍肆,老公的妹妹穿的比我還像新娘袍榆。我一直安慰自己,他們只是感情好匾鸥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布蜡塌。 她就那樣靜靜地躺著,像睡著了一般勿负。 火紅的嫁衣襯著肌膚如雪馏艾。 梳的紋絲不亂的頭發(fā)上劳曹,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音琅摩,去河邊找鬼铁孵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛房资,可吹牛的內(nèi)容都是我干的蜕劝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼轰异,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼岖沛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搭独,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤婴削,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牙肝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唉俗,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年配椭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虫溜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡股缸,死狀恐怖衡楞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乓序,我是刑警寧澤寺酪,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站替劈,受9級(jí)特大地震影響寄雀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陨献,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一盒犹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眨业,春花似錦急膀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聘殖,卻和暖如春晨雳,著一層夾襖步出監(jiān)牢的瞬間行瑞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工餐禁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留血久,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓帮非,卻偏偏與公主長得像氧吐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子末盔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容