gpt4 book ai didi

python - 如何使用带有额外数据的 Flask-sqlalchemy 创建多对多关联?

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:17 25 4
gpt4 key购买 nike

我需要使用 flask-sqlalchemy 将两个模型employeeskill 与额外数据相关联。

例如,user1可以以 100% 的效率完成skill1,以 80% 的效率完成skill2

所以,我制作了 3 个模型:

class Employee(db.Model):
__tablename__ = 'employees'

id = db.Column(db.Integer, primary_key=True)
login = db.Column(db.String(64), index=True, unique=True, nullable=False)

skills = db.relationship('Skill', secondary='employee_skills',
backref=db.backref('employees', lazy='dynamic'))

def __repr__(self):
return '<Employee %r, Skills: %r>' % (self.login, self.skills)


class Skill(db.Model):
__tablename__ = 'skills'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), nullable=False, unique=True)

def __repr__(self):
return '<Skill %r>' % self.name


class EmployeeSkill(db.Model):
__tablename__ = 'employee_skills'

employee_id = db.Column(db.Integer, db.ForeignKey('employees.id'), primary_key=True)
skill_id = db.Column(db.Integer, db.ForeignKey('skills.id'), primary_key=True)
efficiency = db.Column(db.Float)

skills_efficiency = db.relationship('Skill', backref=db.backref('employee_efficiency', lazy='dynamic'))

def __repr__(self):
return '<Engineer %r, skill %r, efficiency %r>' % (
self.employee_id, self.skill_id, self.efficiency)

之后我尝试访问这个协会:

>>> from app import db, models      
>>> emp_=models.Employee.query.all()
>>> emp_[0]
<Employee u'user1', Skills: [<Skill u'skill1'>, <Skill u'skill2'>]>
>>> emp_[0].skills
[<Skill u'skill1'>, <Skill u'skill2'>]
>>> emp_[0].skills[0]
<Skill u'skill1'>
>>> emp_[0].skills[0].employee_efficiency
<sqlalchemy.orm.dynamic.AppenderBaseQuery object at 0x0000000003A68FD0>
>>> emp_[0].skills[0].employee_efficiency[0]
<Engineer 1, skill 1, efficiency u'1'>

我想要的是将Employee实例表示为

<Employee u'user1', Skills: <u'skill1', efficiency: '1'>, <u'skill2', efficiency: '0.8'>>

但我不明白:我是否以错误的方式使用了 db.relationship?还是我需要完成我的 repr 方法?

提前致谢

最佳答案

当您需要关联表中的额外列时,您需要使用 association object pattern 而不是 secondary 属性。这种模式基本上包括将多对多关系分解为两个一对多关系。

在您的情况下,您将创建从 EmployeeEmployeeSkills 的一对多关系,并且您将保持两者之间已有的多对一关系EmployeeSkillsSkill

当您使用 secondary 属性时,SQLAlchemy 会自动为您管理关联表。当您使用关联对象模式时,您必须自己管理关联表,这样您就可以设置或查询额外的列。

关于python - 如何使用带有额外数据的 Flask-sqlalchemy 创建多对多关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26362323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com