【问题标题】:One to many SQL relationship一对多 SQL 关系
【发布时间】:2015-04-23 20:58:45
【问题描述】:
  • 我正在尝试在 Project 表和 Report 表之间建立一对多的关系。
  • 用户可以创建新项目,之后他可以创建一个或多个与该项目相关的新报告。
  • 这两个表将用于报告问题。例如,如果我构建一个新应用程序,我将创建一个包含我的应用程序名称的新项目。稍后,当我在特定设备(如 PC 或 iPhone)上测试我的应用时遇到问题,我将创建一份关于该问题的新报告。

class Project(db.Model):
    project_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    date = db.Column(db.Date)

    def __init__(self, name, date):
        self.name = name
        self.date = date

    def __repr__(self):
        return self.name

class Report(db.Model):
    report_id = db.Column(db.Integer, primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey('project.project_id'))
    project = db.relationship('Report', backref='reports', lazy='dynamic')
    date = db.Column(db.Date)
    issue = db.Column(db.Text)

    def __init__(self, project_id, date, issue):
        self.project_id = project_id
        self.date = date
        self.issue = issue

    def __repr__(self):
        return self.issue

问题:

  1. 两个表之间的连接是否正确为一对多关系?

  2. 这里真的需要 init 函数吗?我在网上看到了一些没有它们的代码!

非常感谢

【问题讨论】:

    标签: python-2.7 flask flask-sqlalchemy


    【解决方案1】:

    Flask-SQLAlchemy's documentation 涵盖了创建一对多关系。它提供了一个Person 具有多个Addresses 的示例。

    class Person(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50))
        addresses = db.relationship('Address', backref='person',
                                    lazy='dynamic')
    
    class Address(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(50))
        person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
    

    这与您所拥有的相匹配。唯一的区别是该示例将关系放在父模型上。它可以放置在任一模型上。我尽量把它放在最有意义的地方。

    至于您的__init__ 方法,它们很可能是不必要的。 Flask-SQLAlchemy 的Model 类有一个__init__,它接受允许您为列分配值的关键字参数。不同之处在于您的版本需要指定的字段,而默认版本不需要任何字段。

    您的版本仅适用于

    project = Project('My Project', date(2015, 4, 23))
    

    Model 的版本不仅工作方式相同,而且工作方式也一样

    project = Project()
    project.name = 'My Project'
    project.date = date(2015, 4, 23)
    

    【讨论】:

    • 你太棒了@dirn。 > 唯一的区别是示例将关系放在父模型上。它可以放置在任一模型上。这真的解释了!我在搜索时看到了这个人地址示例,但后来我看到了其他一对多关系示例,它们的关系线不同,这让我感到困惑。谢谢
    【解决方案2】:

    init 函数在那里,您可以在创建类的实例时设置起始值或执行初始化函数。如果你觉得你不需要做这些事情,你可以省略 init 定义。

    【讨论】:

    • > 如果你觉得你不需要做这些事情,你可以省略 init 定义。谢谢 Rohn,这对您有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2023-04-05
    • 2015-08-05
    相关资源
    最近更新 更多