首页 > 数据库 >flask之sqlalchemy ORM 一对多、多对多

flask之sqlalchemy ORM 一对多、多对多

时间:2025-01-15 16:11:19浏览次数:8  
标签:__ sqlalchemy flask repr Person ORM str Hobby hobby

一、一对多关系

爱好和人的关系,一个爱好可以对应多个人

1、models

# 1 导入一些模块
import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, \
    relationship  # 新的变成它,老的会有  from sqlalchemy.ext.declarative import declarative_base  Warning

from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index

# 2 得到所有表模型需要继承 基类
Base = declarative_base()

class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='篮球')

    def __str__(self):
        return self.caption

class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby指的是tablename而不是类名,uselist=False
    hobby_id = Column(Integer, ForeignKey("hobby.id"))  # 关联字段写在多的一方

    # 跟数据库无关,不会新增字段,只用于快速链表操作
    # 类名,backref用于反向查询
    hobby = relationship('Hobby', backref='pers')  # 等同于django中的relate_name,反向查询替换表名小写的

    def __str__(self):
        return self.name

    def __repr__(self):
        return self.name

补充:

1.1 __str__ 和 __repr__ 方法

__str__ 作用:

  • __str__ 方法用于定义对象的“用户友好”字符串表示形式。

  • 当你使用 print(obj) 或 str(obj) 时,Python 会调用 __str__ 方法来获取对象的字符串表示。

  • 这个方法通常用于向用户展示对象的描述性信息。

user = Users(name="Alice")
print(user)  # 输出: Alice

__repr__作用:

  • __repr__ 方法用于定义对象的“开发者友好”字符串表示形式。

  • 当你直接在交互式环境中输入对象名称(如 obj)或使用 repr(obj) 时,Python 会调用 __repr__ 方法。

  • 这个方法通常用于调试和开发,返回的字符串应该尽可能明确地描述对象的状态。

  • 如果 __str__ 方法未定义,__repr__ 会作为 __str__ 的备用方法。

def __repr__(self):
    return f"<User(id={self.id}, name={self.name}, email={self.email})>"

1.2、 relationship

 hobby = relationship('Hobby', backref='pers') 

  • 'Hobby'

    • 指定关联的模型类为 Hobby

  • backref='pers'

    • 在 Hobby 模型中创建一个 pers 属性,用于反向查询与该 Hobby 关联的所有 Person 对象。

    • 例如,可以通过 hobby.pers 获取所有喜欢该 Hobby 的 Person 对象。

正向查询

通过 Person 对象访问关联的 Hobby 对象:

person = session.query(Person).all()
print(person[1].name)
print(person[1].hobby)

## 结果
dapeng
乒乓球

反向查询

通过 Hobby 对象访问关联的 Person 对象:

hobby = session.query(Hobby).all()
print(hobby[1].pers)  # 获取所有喜欢该 Hobby 的 Person 对象

  

 

二、多对多关系

标签:__,sqlalchemy,flask,repr,Person,ORM,str,Hobby,hobby
From: https://www.cnblogs.com/dgp-zjz/p/18673257

相关文章