जब मैं इस गाइड के बाद SQLAlchemy संबंध उदाहरण का प्रयास करता हूं: मूल संबंध पैटर्न
मेरे पास यह कोड है
#!/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बनाम के बारे में एक नोटbackref:backrefअधिक रसीला है क्योंकि आपको दोनों वर्गों पर संबंध घोषित करने की आवश्यकता नहीं है, लेकिन व्यवहार में मुझे लगता है कि यह लाइन पर इसे बचाने के लायक नहीं है। मुझे लगताback_populatesहै कि बेहतर है, न केवल इसलिए कि अजगर संस्कृति में "स्पष्ट है निहित से बेहतर है" (पायथन के ज़ेन), लेकिन जब आपके पास कई मॉडल हैं, तो इसकी घोषणा पर एक त्वरित नज़र के साथ आप सभी रिश्तों और उनके नामों को खत्म होने के बजाय देख सकते हैं सभी संबंधित मॉडल। इसके अलावा, इसका एक अच्छा पक्षback_populatesयह है कि आपको अधिकांश IDE पर दोनों दिशाओं में ऑटो-पूर्ण मिलता है))