遇到乙個問題,請各位給講解一下SQLAlchemy中的backref?

時間 2021-05-31 22:13:46

1樓:JIMMM

不知道理解得對不對:

A類裡面有個屬性b,

還有乙個C類

b=db.relationship('C')<=>A通過b訪問C

定義了backref後

b=db.realtionship('C',backref=db.backref('d'))

<=>A可以通過b訪問C,並且C可以通過d訪問A

2樓:

關於 relationship 函式最高票回答已經解釋的很清楚了, 一開始我也與樓主有相同的疑問, 後來看了官方文件算是明白了些, 實際上 backref引數只是在 relationship函式對應的類中做重複的事(個人理解是建立關係)的快捷方式, 如:

class

User

(Base

):__tablename__

='user'id=

Column

(Integer

,primary_key

=True

)name

=Column

(String

)addresses

=relationship

("Address"

,backref

="user"

)class

Address

(Base

):__tablename__

='address'id=

Column

(Integer

,primary_key

=True

)email

=Column

(String

)user_id

=Column

(Integer

,ForeignKey

('user.id'

))實際上相當於:

class

User

(Base

):__tablename__

='user'id=

Column

(Integer

,primary_key

=True

)name

=Column

(String

)addresses

=relationship

("Address"

,back_populates

="user"

)class

Address

(Base

):__tablename__

='address'id=

Column

(Integer

,primary_key

=True

)email

=Column

(String

)user_id

=Column

(Integer

,ForeignKey

('user.id'

))user

=relationship

("User"

,back_populates

="addresses"

)back_populates表明他們應該互相之間建立「雙向」的行為

這種關係將事件處理程式新增到兩個屬性中,這兩個屬性的行為是「當發生追加或設定事件時,使用這個特定屬性名稱將自己設定為傳入屬性」。行為如下所示。從User和Address例項開始。.

addresses集合是空的,.user屬性是None:

>>> u1 = User()

>>> a1 = Address()

>>> u1.addresses

>>> print(a1.user)

None

但是,一旦將Address附加到u1.addresses集合,集合和標量屬性都將被填充:

>>> u1.addresses

[<__main__.Address object at 0x12a6ed0>]

>>> a1.user

<__main__.User object at 0x12a6590>

這種行為當然也適用於清除操作,以及雙方的等同操作。例如當.user再次設定為None時,Address物件將從反向集合中移除:

>>> a1.user = None

>>> u1.addresses

對.addresses集合和.user屬性的操作完全是在Python中進行的,沒有與SQL資料庫進行任何互動

所以, 使用backref

關鍵字時,兩個關係是分別使用back_populates

建立的

而 db.backref()是你需要對放置 backref的那一邊的引數(在上例中為 Address類的 .user屬性)指定引數時, 使用 backref()函式代替字串, 常見的有 lazy='dynamic'(禁止自動查詢, 用於新增過濾器)

簡單地說就是: backref用於在關係另一端的類中快捷地建立乙個指向當前類物件的屬性, 而當需要對那個屬性指定引數時使用 db.backref()

回答只為拋磚引玉, 詳見: orm_backref

3樓:

以下內容引自:SQLAlchemy 教程 -- 基礎入門篇

對於乙個普通的部落格應用來說,使用者和文章顯然是乙個一對多的關係,一篇文章屬於乙個使用者,乙個使用者可以寫很多篇文章,那麼他們之間的關係可以這樣定義:

class User(Basetablename__ = 'users'

id = Column(Integer, primary_key=True)

username = Column(String(64), nullable=False, index=True)

password = Column(String(64), nullable=False)

email = Column(String(64), nullable=False, index=True)

articles = relationship('Article')

def __repr__(selfreturn '%s(%r)' % (self.__class__.__name__, self.username)

class Article(Basetablename__ = 'articles'

id = Column(Integer, primary_key=True)

title = Column(String(255), nullable=False, index=True)

content = Column(Text)

user_id = Column(Integer, ForeignKey('users.id'))

author = relationship('User')

def __repr__(selfreturn '%s(%r)' % (self.__class__.__name__, self.title)

每篇文章有乙個外來鍵指向 users 表中的主鍵 id, 而在 User 中使用 SQLAlchemy 提供的 relationship 描述關係。而使用者與文章的之間的這個關係是雙向的,所以我們看到上面的兩張表中都定義了 relationship。

SQLAlchemy 提供了 backref 讓我們可以只需要定義乙個關係:

articles = relationship('Article', backref='author')

新增了這個就可以不用再在 Article 中定義 relationship 了!

4樓:「已登出」

flask-sqlalchemy中 backref lazy的引數例項解釋和選擇

SQLalchemy relationship之lazy屬性學習筆記

把這兩篇文章仔細看一遍應該就差不多了。

5樓:霧色

一對多:乙個父親可能有多個孩子

1class

Father

(Base):2

id=Column

(Integer

,primary_key

=True)3

children

=relationship

('Children'

,backref

='father')4

class

Children

(Base):5

father_id

=Column

(Integer

,ForeignKey

('father.id'

))line 1: 我是爸爸

line 2: 這是我的號碼

line 3: 我有一些孩子登記在Children表上。上面的每乙個children都可以通過 .

father找到我。backref是我給孩子們的名片(上面是號碼)

line 4: 我是孩子

line 5: 我拿著爸爸的號碼

當我們需要在父表中新增子表關係時使用 relationship,外來鍵通常是父表的主鍵

6樓:

backref = db.backref('person', lazy='joined'), lazy='dynamic')一般用在子表中,父表(某一字段被其他類引用為外來鍵)中使用的是backref =『user』

提個問題,乙個刑法題,希望各位大佬給解答一下

哈哈哈 不作為的故意殺人罪夫妻之間具有救助撫養義務。當事人是否放棄生命是她自己的權利,但是有義務的人必須履行義務,其他人行使權利和你履行義務並不矛盾。 鹿肉真好吃 可能構成不作為犯罪。在司法實踐中存在兩種決然不同的判決 第一種認為構成不作為的故意殺人罪。夫妻之間具有相互扶助的義務,這是法定義務,而在...

這句英語如何分析,請幫忙講解一下

起於一 itfocuses onthe efforts 省略引導詞that countries can maketo deal withglobal warming 夏夏 It focuses on the efforts that contries can make to deal with gl...

乙個有關概率的問題,請大佬指教一下

htiannn 缺少條件了,如果遊戲規則是你選了一扇門後,主持人從剩下的兩扇門中開啟一扇後面是羊的門,那麼就是典型的三門問題,換門後是車的概率是2 3。但沒有說明是這個規則,有很多種規則可以出現 你選擇了一號門,然後主持人說我們來看一下另兩個門後面到底是什麼,主持人開啟了三號門,後面是山羊 的情況,...