Модель 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?
1 ответ
Я пишу это для sqlalchemy, я не знаю про Фабричного мальчика. У вас уже есть таблица, которая позволяет вам определять отношения между пользователями и группами (таблица 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 хороша.