一对多的SQL关系

时间:2015-04-23 20:58:46

标签: python-2.7 flask flask-sqlalchemy

  • 我正在尝试在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 功能吗?没有他们,我在网上看到了一些代码!

  3. 非常感谢

2 个答案:

答案 0 :(得分:0)

init 函数是这样的,因此当您创建类的实例时,您可以设置起始值或执行初始化函数。如果您觉得不需要这样做,可以省略 init 定义。

答案 1 :(得分:0)

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

的示例
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)