Отношение "многие ко многим" Flask sqlalchemy and marshmallow - PullRequest
2 голосов
/ 01 августа 2020

Предположим, у меня есть 2 таблицы, таблица 1 состоит из информации о пользователях, а таблица 2 - из информации о ветке. Таблица 1 и таблица 2 связаны друг с другом отношениями многие ко многим. например, 1 пользователь может работать в нескольких филиалах, а в одном филиале может быть несколько пользователей. так что здесь нет концепции родительского ребенка. Мне было интересно, нужно ли мне создать другую таблицу со схемой и связать ее с таблицей пользователей и ветвей, используя внешний ключ, или я должен создать таблицу ассоциаций.

Я сделал это:

class UserBranchMap(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    branch_id = db.Column(db.Integer,db.ForeignKey('branch.id'))
    branch = db.relationship("Branch", backref=db.backref("UBMbranch", lazy="dynamic"))
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
    user = db.relationship("User", backref=db.backref("UBMuser", lazy="dynamic"))
    created_at = db.Column(db.VARCHAR(20), nullable = False)
    created_by = db.Column(db.VARCHAR(20), nullable = False)

class UserBranchMapSchema(ma.Schema):
    branch = fields.Nested(branch_schema)
    user = fields.Nested(user_schema)
    class Meta:
        fields = ('branch_id','user_id','created_at','created_by')

userbranchmap_schema = UserBranchMapSchema()
userbranchmaps_schema = UserBranchMapSchema(many = True)

в чем разница между таблицей ассоциаций и этой таблицей сопоставления?

1 Ответ

3 голосов
/ 01 августа 2020

Если я вас правильно понимаю, вы спрашиваете о разнице между таблицей ассоциаций

UserBranches = db.Table(
    'user_branches',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('branch_id', db.Integer, db.ForeignKey('branch.id'), primary_key=True)
)

и таблицей сопоставления

class UserBranch(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user = db.relationship("User", backref=db.backref("UBMuser", lazy="dynamic"))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    branch = db.relationship("Branch", backref=db.backref("UBMbranch", lazy="dynamic"))
    branch_id = db.Column(db.Integer, db.ForeignKey('branch.id'))

На уровне базы данных нет реальная разница между ними. Если вы хотите иметь строгое отношение «многие ко многим» между двумя таблицами, просто используйте таблицу ассоциаций. Благодаря SQLAlchemy вам никогда не придется ничего с ним делать, потому что присоединение через эту таблицу происходит автоматически, как только вы присоединяете пользователей к ветвям или наоборот.

Однако, если вы хотите сделать больше, например если он действительно обозначает связь, тогда таблица сопоставления, как вы написали, соответствует go, потому что она ведет себя точно так же, как обычная таблица. Это означает, что вы можете использовать его как UserBranch.created_at или даже запрашивать его напрямую, если хотите.

...