一对多 SQL 关系

One to many SQL relationship


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. 两个table之间的连接是否正确为一对多关系?

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

非常感谢

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

Flask-SQLAlchemy's documentation 包括创建一对多关系。它提供了一个 Person 有很多 Address 的例子。

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 class 有一个 __init__ 接受关键字参数,允许您为列赋值。区别在于您的版本需要指定字段,而默认版本不需要任何字段。

您的版本仅适用于

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

Model的版本不仅以同样的方式工作,而且还像

一样工作
project = Project()
project.name = 'My Project'
project.date = date(2015, 4, 23)