0

ゲームには、PlayerとAllianceの2つの単純なエンティティがあり、同盟名を持つ同じ国のすべてのユーザーをフェッチする必要があります(同盟に名前がある場合は、同盟名はnullになります)。

class Base(object):
     def __tablename__(self):
       return self.__name__.lower()

     id = Column(Integer, primary_key=True, nullable=False)

class PlayerModel(Base):
    __tablename__ = 'players'
    alliances_id = Column(Integer, nullable=True)
    username = Column(String(30), nullable=False)
    nation = Column(String(20), nullable=False)
    score = Column(String(20), default=0)

class AllianceModel(Base):
    __tablename__ = 'alliances'
    name = Column(String(50), nullable=False)
    nation = Column(String(20), nullable=False)


//query

for player in session.query(PlayerModel).filter(PlayerModel.nation.like(nation)):
    alliance =session.query(AllianceModel).filter(AllianceModel.id==player.alliance_id).first()
    result.append({'username':player.username, 'alliance':alliance.name})

これを1つのクエリにのみ接続できますか?(外部キーがある場合はjoinを使用することは知っていますが、プレーヤーはすべての同盟から外れる可能性があり、alliances_idはnullになる可能性があります)。

4

1 に答える 1

1

alliances_id列を外部キーとしてマークします。

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class PlayerModel(Base):
    __tablename__ = 'players'
    alliances_id = Column(Integer, nullable=True, ForeignKey('AllianceModel.id'))
    alliance = relationship('AllianceModel')
    username = Column(String(30), nullable=False)
    nation = Column(String(20), nullable=False)
    score = Column(String(20), default=0)

次に、単に参照してくださいplayer.alliance

for player in session.query(PlayerModel).filter(PlayerModel.nation.like(nation)):
    result.append({'username':player.username, 'alliance': player.aliance.name if player.aliance is not None else ''})

ForeignKey()に制約を追加したくない、または追加できない場合はalliances_id、その情報をrelationship()宣言に追加することもできます。

    alliances_id = Column(Integer, nullable=True)
    alliance = relationship('AllianceModel', foreign_keys='AllianceModel.id')
于 2012-12-28T13:51:02.023 に答える