在Python的SQLAlchemy中连接两个表时,如何在一个对象中获得键值对?

在Python的SQLAlchemy中连接两个表时,如何在一个对象中获得键值对?,python,sqlalchemy,fastapi,Python,Sqlalchemy,Fastapi,我有两张表,员工和部门,加入后我得到的结果是这样的 [ { "name": "Omar Hasan", "id": 1, "email": "omar@example.com" }, { "dept_name": "Engineering", "id":

我有两张表,员工和部门,加入后我得到的结果是这样的

[
    {
      "name": "Omar Hasan",
      "id": 1,
      "email": "omar@example.com"
    },
    {
      "dept_name": "Engineering",
      "id": 2
    }
]
但我希望结果是一个像

[
    {
      "name": "Omar Hasan",
      "id": 1,
      "email": "omar@example.com",
      "dept_name": "Engineering",
    },
    ......
    ......
]
这是我的密码

型号,部门id在员工表中为FK

class Employee(Base):
    __tablename__ = "employees"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    email = Column(String, unique=True, index=True)
    password = Column(String)
    is_active = Column(Boolean, default=True)
    salary = Column(Numeric(10, 2))
    dept_id = Column(Integer, ForeignKey('departments.id'), nullable=False)

    department = relationship("Department", back_populates="owner")

class Department(Base):
    __tablename__ = "departments"

    id = Column(Integer, primary_key=True, index=True)
    dept_name = Column(String, unique=True, index=True)

    owner = relationship("Employee", back_populates="department")
下面是生成上述结果的查询

return db.query(models.Employee, models.Department)\
        .join(models.Employee.department)\
        .options(
        Load(models.Employee).load_only("name", "email"),
        Load(models.Department).load_only("dept_name")
        )\
        .all()

您可以使用在两个模型之间定义的关系来允许在生成结果时访问部门名称,而不是显式地连接这两个模型

#仅查询员工
res=session.query(员工)\
.选项(
orm.Load(员工)。仅加载(“姓名”、“电子邮件”),
表格加载(部门)。仅加载(“部门名称”)
)\
.all()
映射=[]
对于res中的员工:
d={
“name”:employee.name,
“id”:employee.id,
“电子邮件”:employee.email,
“部门名称”employee.department.name
}
append(d)
通过在
Employee
上定义department name属性,我们可以使构建结果词典更加优雅:

class员工(基本):
...
@财产
def部门名称(自我):
返回self.department.dept\u名称
...
#列出我们想要的属性
attrs=['name','id','email','dept_name']
#使用字典理解构建映射
映射=[{attr:getattr(e,attr)for attr in attrs}for e in res]

与标准的
属性
不同,我们可以使用,但除非您想在查询中使用它,否则在这里这样做没有多大价值。

在生成结果时,您可以使用它们之间定义的关系来允许访问部门名称,而不是显式地连接这两个模型

#仅查询员工
res=session.query(员工)\
.选项(
orm.Load(员工)。仅加载(“姓名”、“电子邮件”),
表格加载(部门)。仅加载(“部门名称”)
)\
.all()
映射=[]
对于res中的员工:
d={
“name”:employee.name,
“id”:employee.id,
“电子邮件”:employee.email,
“部门名称”employee.department.name
}
append(d)
通过在
Employee
上定义department name属性,我们可以使构建结果词典更加优雅:

class员工(基本):
...
@财产
def部门名称(自我):
返回self.department.dept\u名称
...
#列出我们想要的属性
attrs=['name','id','email','dept_name']
#使用字典理解构建映射
映射=[{attr:getattr(e,attr)for attr in attrs}for e in res]
我们可以使用,而不是标准的
属性
,但是在这里这样做没有多大价值,除非您想在查询中使用它