溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Django model反向關(guān)聯(lián)名稱的方法

發(fā)布時間:2020-09-15 11:36:04 來源:腳本之家 閱讀:191 作者:GrandG7 欄目:開發(fā)技術(shù)

如果你在 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)容了,希望能給大家一個參考,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI