Для понимания backref, пожалуйста, проверьте приведенный пример
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Column, Integer, String
from sqlalchemy import Table, Text
engine = create_engine('mysql://root:ababab@localhost/alctest',
echo=False)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key = True)
name = Column(String(100))
fullname = Column(String(100))
password = Column(String(100))
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key = True)
email_address = Column(String(100), nullable=False)
#foreign key, must define relationship
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", backref = backref('addresses',order_by=id))
Это очень простой пример. Теперь, если вы хотите получить доступ к user
из addresses
, вы можете напрямую получить атрибут user_id
, если addresses
модель. Это вернет вам id
из user
.
Если вам нужен объект user
, который связан с этим addresses
, то вы должны использовать get()
метод с user_id
.
Теперь в обратном случае, если вы хотите получить доступ к addresses
из user
, тогда вы должны выполнить запрос как
SELECT * FROM addresses WHERE user_id = $1
Но если вы будете использовать backref
, то sqlalchemy будет запускать этот запрос при доступе к этому атрибуту.
Теперь в нашем примере, если вы получите доступ к userobject.addresses
, он запустит запрос
SELECT * FROM addresses WHERE user_id = userobject.id
Нет атрибута типа addresses
в User
модели, который будет установлен backref
из Address
атрибута user
модели.