Django model反向關(guān)聯(lián)名稱的方法
如果你在 ForeignKey或 ManyToManyField字段上使用 related_name屬性,你必須總是為該字段指定一個(gè)唯一的反向名稱。但在抽象基類上這樣做就會(huì)引發(fā)一個(gè)很嚴(yán)重的問題。因?yàn)?Django 會(huì)將基類字段添加到每個(gè)子類當(dāng)中,而每個(gè)子類的字段屬性值都完全相同 (這里面就包括related_name)。
當(dāng)你在(且僅在)抽象基類中使用 related_name 時(shí),如果想繞過這個(gè)問題,名稱中就要包含'%(app_label)s'和 ‘%(class)s'。
‘%(class)s'會(huì)替換為子類的小寫加下劃線格式的名稱,字段在子類中使用。
‘%(app_label)s'會(huì)替換為應(yīng)用的小寫加下劃線格式的名稱,應(yīng)用包含子類。每個(gè)安裝的應(yīng)用名稱都應(yīng)該是唯一的,而且應(yīng)用里每個(gè)模型類的名稱也應(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 就會(huì)在驗(yàn)證 model (或運(yùn)行 migrate) 時(shí)拋出錯(cuò)誤。
如果你沒有在抽象基類中為某個(gè)關(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)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?的counter()函數(shù)解析與示例詳解
在?Python?中,?collections?模塊提供了?Counter?類,用于計(jì)算可迭代對象中元素的數(shù)量,?Counter?是一個(gè)字典的子類,它以元素作為鍵,以元素出現(xiàn)的次數(shù)作為值進(jìn)行計(jì)數(shù),本文給大家介紹Python?的counter()函數(shù),感興趣的朋友一起看看吧2023-08-08
python 調(diào)試?yán)渲R(小結(jié))
這篇文章主要介紹了python 調(diào)試?yán)渲R(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
徹底卸載Anaconda詳細(xì)教程(超詳細(xì)!)
這篇文章主要給大家介紹了關(guān)于徹底卸載Anaconda的相關(guān)資料,Anaconda(官方網(wǎng)站)就是可以便捷獲取包且對包能夠進(jìn)行管理,同時(shí)對環(huán)境可以統(tǒng)一管理的發(fā)行版本,需要的朋友可以參考下2023-11-11
Pandas之?dāng)?shù)據(jù)追加df.append方式
這篇文章主要介紹了Pandas之?dāng)?shù)據(jù)追加df.append方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python+Selenium實(shí)現(xiàn)讀取網(wǎng)易郵箱驗(yàn)證碼
在自動(dòng)化工作中,有可能會(huì)遇到一些發(fā)送郵箱驗(yàn)證碼類似的功能。本文將利用Python?Selenium實(shí)現(xiàn)自動(dòng)化讀取網(wǎng)易郵箱驗(yàn)證碼,感興趣的可以了解一下2022-03-03
關(guān)于Python函數(shù)參數(shù)的進(jìn)階用法
這篇文章主要給大家分享的是Python函數(shù)參數(shù)的進(jìn)階用法,Python函數(shù)的參數(shù)根據(jù)函數(shù) 在調(diào)用時(shí) 傳參的形式分為關(guān)鍵字參數(shù)和位置參數(shù),下面文章小編就來介紹相關(guān)資料,需要的朋友可以參考一下2021-10-10

