Django model反向關(guān)聯(lián)名稱的方法
如果你在 ForeignKey或 ManyToManyField字段上使用 related_name屬性,你必須總是為該字段指定一個唯一的反向名稱。但在抽象基類上這樣做就會引發(fā)一個很嚴(yán)重的問題。因為 Django 會將基類字段添加到每個子類當(dāng)中,而每個子類的字段屬性值都完全相同 (這里面就包括related_name)。
當(dāng)你在(且僅在)抽象基類中使用 related_name 時,如果想繞過這個問題,名稱中就要包含'%(app_label)s'和 ‘%(class)s'。
‘%(class)s'會替換為子類的小寫加下劃線格式的名稱,字段在子類中使用。
‘%(app_label)s'會替換為應(yīng)用的小寫加下劃線格式的名稱,應(yīng)用包含子類。每個安裝的應(yīng)用名稱都應(yīng)該是唯一的,而且應(yīng)用里每個模型類的名稱也應(yīng)該是唯一的,所以產(chǎn)生的名稱應(yīng)該彼此不同。
from django.db import models class Base(models.Model): m2m = models.ManyToManyField(OtherModel, related_name="%(app_label)s_%(class)s_related") class Meta: abstract = True class ChildA(Base): pass class ChildB(Base): pass
ChildA.m2m 字段的反向名稱是 common_childa_related,而 ChildB.m2m 字段的反向名稱是 rare_childb_related。這取決于你如何使用 ‘%(class)s' 和'%(app_label)s來構(gòu)造你的反向名稱。如果你沒有這樣做,Django 就會在驗證 model (或運行 migrate) 時拋出錯誤。
如果你沒有在抽象基類中為某個關(guān)聯(lián)字段定義 related_name 屬性,那么默認(rèn)的反向名稱就是子類名稱加上'_set',它能否正常工作取決于你是否在子類中定義了同名字段。例如,在上面的代碼中,如果去掉 related_name屬性,在 ChildA中,m2m 字段的反向名稱就是 childa_set;而 ChildB的 m2m 字段的反向名稱就是 childb_set。
以上這篇Django model反向關(guān)聯(lián)名稱的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python構(gòu)建自定義回調(diào)函數(shù)詳解
在工作中,回調(diào)函數(shù)使用的場景是非常多的,下面我們就來通過例子程序來詳細了解利用了Python的屬性機制構(gòu)建了一個自定義回調(diào)函數(shù)的使用2017-06-06深度學(xué)習(xí)詳解之初試機器學(xué)習(xí)
機器學(xué)習(xí)可應(yīng)用在各個方面,本篇將在系統(tǒng)性進入機器學(xué)習(xí)方向前,初步認(rèn)識機器學(xué)習(xí),利用線性回歸預(yù)測波士頓房價,讓我們一起來看看吧2021-04-04使用Python一鍵提取PDF中的表格到Excel的方法詳解
從PDF文件獲取表格中的數(shù)據(jù),也是日常辦公容易涉及到的一項工作,一個一個復(fù)制吧,效率確實太低了,用Python從PDF文檔中提取表格數(shù)據(jù),并寫入Excel文件,灰?;页8咝?本文就給大家介紹一下如何使用Python一鍵提取PDF中的表格到Excel,需要的朋友可以參考下2023-08-08Python matplotlib超詳細教程實現(xiàn)圖形繪制
matplotlib 模塊不僅提供了繪制統(tǒng)計圖表的功能,還支持繪制圓形、正方形、矩形等各種圖形。這篇文章主要為大家詳細介紹了利用matplotlib.patches 繪制一些基本圖形,快來跟隨小編一起學(xué)習(xí)吧2021-12-12