Модель Factory Boy с полями «один ко многим» и «многие ко многим»

Я тестирую свои модели SQLAlchemy с помощью pytest и 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?


person sandorlev    schedule 08.12.2016    source источник


Ответы (1)


Я пишу это для части sqlalchemy, я не знаю о Фабричном мальчике. У вас уже есть таблица, которая позволяет вам устанавливать отношения n к n между пользователями и группами (таблица UserGroup) и пользовательские токены, например:

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 хороша.

person metmirr    schedule 08.12.2016
comment
Спасибо за ваш ответ, проблема оказалась в инициализации моего сеанса с автофиксацией и автосбросом, для которых установлено значение False. - person sandorlev; 08.12.2016