SQLAlchemy에서 다 대다 매핑과 같은 소셜 네트워크를 만들려고한다. 그것은 Character 클래스와 Character_relations 크로스 테이블을 가지고있어서 Character에서 Character로 연결됩니다. 지금까지는 쉽습니다.SQLAlchemy : 나와 함께한다면, 나도 너와 함께있어. 자기 참조 M2M 관계.
character_relationships = Table('character_relationships', Base.metadata,
Column('me_id', Integer, ForeignKey('characters.id', ondelete=True, onupdate=True), nullable=False, primary_key=True),
Column('other_id', Integer, ForeignKey('characters.id', ondelete=True, onupdate=True), nullable=False, primary_key=True),
UniqueConstraint('me_id', 'other_id', name='uix_1')
)
class CharacterRelationship(object):
def __init__(self, me_id, other_id):
self.me_id = me_id
self.other_id = other_id
mapper(CharacterRelationship, character_relationships)
class Character(IdMixin, TimestampMixin, Base):
__tablename__ = "characters"
name = Column(Unicode, nullable=False)
friends = relationship(lambda: Character, secondary=character_relationships,
primaryjoin=lambda: Character.id==character_relationships.c.me_id,
secondaryjoin=lambda: Character.id==character_relationships.c.other_id,
backref=backref('knows_me')
)
일면과 양면의 두 가지 관계가 있습니다. 그것은 내가 가질 수있는 십자가 테이블에 있습니다
CharacterRelationship(me_id=1, other_id=2)
CharacterRelationship(me_id=2, other_id=1)
위에서 주어진 Character.friends 인수는 일원 관계에 관한 것입니다. 양국 관계에 대한 속성/열 속성을 어떻게 추가 할 수 있습니까?
"my_character.real_friends는 관계가"양쪽에서 나옵니다 "인 경우 CharacterRelationship의 항목 만 포함합니다.
은 내가
@property
def real_friends(self):
return set(my_character.friends) & set(my_character.knows_me)
같은 것을 사용할 수 있지만,이 SQL에 잘 번역하지 않고, 나는 데이터베이스 수준에서이 교집합을하고 엄청난 속도 향상을 기대하는 것을 알고있다. 그러나 달성 할 것이 더 있습니다!
- -1 의미
character.friends.other_character character.friends.relationship_type = -1 | 0 | 1
내가 다른 일방적으로 알고
- 0 양자 : 더 나은
같은 최종 목적을 가지고하는 것입니다 나 일방적으로
이 논리를 데이터베이스 수준에 적용 할 이유가 있습니까? 그렇다면 어떻게 할 것입니까? 알다시피, 간단한 real_friend 양측 부분을 데이터베이스 수준에 두는 방법을 알고 있습니까?
잊지 마세요 이 (자기'사용 object_session하기)' – Eric