Коли я пробую SQLAlchemy Relation Example, дотримуючись цього посібника: Основні зв’язки
У мене є цей код
#!/usr/bin/env python
# encoding: utf-8
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
parent = relationship("Parent")
Base.metadata.create_all()
p = Parent()
session.add(p)
session.commit()
c = Child(parent_id=p.id)
session.add(c)
session.commit()
print "children: {}".format(p.children[0].id)
print "parent: {}".format(c.parent.id)
Це працює добре, але в керівництві сказано, що модель має бути такою:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
**children = relationship("Child", back_populates="parent")**
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
**parent = relationship("Parent", back_populates="children")**
Чому мені не потрібно back_populates
чи backref
на моєму прикладі? Коли слід використовувати той чи інший?
back_populates
vsbackref
:backref
є більш стислою, оскільки вам не потрібно оголошувати відношення в обох класах, але на практиці я вважаю, що не варто зберігати це в режимі онлайн. Я думаю, щоback_populates
це краще, не тільки тому, що в культурі python "Явне краще, ніж неявне" (Zen of Python), але коли у вас багато моделей, швидким поглядом на його оголошення ви можете побачити всі відносини та їх імена, замість того, щоб переходити всі пов’язані моделі. Крім того, приємною побічною перевагоюback_populates
є те, що ви отримуєте автозаповнення в обох напрямках на більшості IDE =)