Quelle est la différence entre back_populates et backref dans SQL Alchemy? Que se passe-t-il si je n'écris aucun d'eux? L'histoire.
Pour écrire à partir de la conclusion,
(1) Lorsque backref est utilisé Cela crée automatiquement une relation bidirectionnelle.
(2) Lorsque back_populates est utilisé Vous devez créer vous-même une relation bidirectionnelle.
(3) Lorsque ni back_populates ni backref ne sont utilisés Les champs annulés ne sont pas automatiquement mis à jour lors d'une transaction.
Il se trouve que.
Regardons un exemple concret. Considérez le modèle d'événement et le modèle de ticket comme exemples. Un événement a plusieurs billets, une relation un à plusieurs.
class Event(Base):
__tablename__ = 'event'
id = Column(Integer, primary_key=True)
title = Column(String(255))
tickets = relationship("Ticket",backref="event")
class Ticket(Base):
__tablename__ = 'ticket'
id = Column(Integer,primary_key=True)
title = Column(String(255))
value = Column(Integer)
event_id = Column(Integer,ForeignKey('event.id'))
event = Event(title="test")
ticket = Ticket(title="test_ticket",value=5000)
event.tickets = [ticket]
event.tickets #Ticket Objects
ticket.event #Event Object
Lorsque vous utilisez back_populates, cela ne fonctionnera que si vous avez une relation bidirectionnelle.
class Event(Base):
__tablename__ = 'event'
id = Column(Integer, primary_key=True)
title = Column(String(255))
tickets = relationship("Ticket",back_populates="event")
class Ticket(Base):
__tablename__ = 'ticket'
id = Column(Integer,primary_key=True)
title = Column(String(255))
value = Column(Integer)
event_id = Column(Integer,ForeignKey('event.id'))
event = relationship("Event",back_populates="tickets")
event = Event(title="test")
ticket = Ticket(title="test_ticket",value=5000)
event.tickets = [ticket]
event.tickets #Ticket Objects
ticket.event #Event Object
class Event(Base):
__tablename__ = 'event'
id = Column(Integer, primary_key=True)
title = Column(String(255))
tickets = relationship("Ticket")
class Ticket(Base):
__tablename__ = 'ticket'
id = Column(Integer,primary_key=True)
title = Column(String(255))
value = Column(Integer)
event_id = Column(Integer,ForeignKey('event.id'))
event = relationship("Event")
event = Event(title="test")
ticket = Ticket(title="test_ticket",value=5000)
event.tickets = [ticket]
event.tickets #Ticket Objects
ticket.event #None
Dans ce cas, ticket → événement est Aucun. En d'autres termes, on peut voir que l'événement n'est pas associé au ticket dans la transaction. Bien entendu, une fois la transaction terminée (après l'insertion de l'objet événement), ils sont liés dans les deux sens.
event = self.session.query(Event).filter(Event.id==1).one()
ticket = self.session.query(Ticket).filter(Ticket.id==1).one()
event.tickets #Ticket Objects
ticket.event #Event Object
Recommended Posts