2016-12-08 50 views
1

我正在用pytest和Factory Boy測試我的SQLAlchemy模型,但我發現他們的文檔缺乏關係。我有我的架構設置,以便還有誰可以屬於多個組(組可以容納多個用戶),他們可以有多個令牌用戶,但令牌只屬於單個用戶:具有一對多和多對多字段的Factory Boy模型

_user_groups_table = Table(
    'user_groups', Base.metadata, 
    Column('user_id', INTEGER(unsigned=True), ForeignKey('user.id')), 
    Column('group_id', INTEGER(unsigned=True), ForeignKey('user_group.id')) 
) 


class UserGroup(Base): 
    __tablename__ = 'user_group' 

    id = Column(INTEGER(unsigned=True), Sequence('user_group_id_seq'), primary_key=True, autoincrement=True) 
    name = Column(String(255), unique=True, nullable=False) 


class User(Base): 
    __tablename__ = 'user' 

    id = Column(INTEGER(unsigned=True), Sequence('user_id_seq'), primary_key=True, autoincrement=True) 
    name = Column(String(255), unique=True, nullable=False) 
    groups = relationship('UserGroup', secondary=_user_groups_table) 
    auth_tokens = relationship('Token', cascade='delete') 


class Token(Base): 
    __tablename__ = 'token' 

    id = Column(INTEGER(unsigned=True), Sequence('token_id_seq'), primary_key=True, autoincrement=True) 
    user_id = Column(INTEGER(unsigned=True), ForeignKey('user.id'), nullable=False) 
    value = Column(String(511), unique=True, nullable=False) 

我已經一直在嘗試不同的東西,其中包括一個@ factory.post_generation方法,用於將用戶實例中的標記添加到羣組&中,但是當我將用戶放入夾具中並將其用於測試函數時,這些字段從不顯示。你有什麼建議如何用Factory Boy對這個模式進行建模?

回答

0

我寫這個sqlalchemy部分我不知道工廠的男孩。你已經擁有它讓你N到例如用戶和組(用戶組表)和用戶令牌n之間關係的表:

id user_id group_id  id user_id value 
1 5  3    1 5  adb45 
2 5  4    2 5  xyz01 
3 5  5 
4 1  9 
5 1  3  

class User(Base): 
    __tablename__ = "users" 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(255), unique=True, nullable=False) 

    tokens = relationship("Token", backref="user") 

class Group(Base): 
    __tablename__ = "groups" 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String(255), unique=True, nullable=False) 

class UserGroup(Base): 
    __tablename__ = "usergroups" 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    group_id = Column(Integer, ForeignKey("Group.id")) 
    user_id = Column(Integer, ForeignKey("User.id")) 

class Token(Base): 
    __tablename__ = "tokens" 
    id = Column(Integer, primary_key=True, autoincrement=True) 
    value = Column(String(511), unique=True, nullable=False) 

    user_id = Column(Integer, ForeignKey("User.id")) 

和SQLAlchemy的文檔是好的。

+0

感謝您的回答,問題原來是用autocommit和autoflush初始化我的會話都設置爲False。 – sandorlev