gpt4 book ai didi

flask - 如何定义一个SQLAlchemy多对多关系

转载 作者:行者123 更新时间:2023-12-03 17:18:19 25 4
gpt4 key购买 nike

我用flask和sqlalchemy编写了一个项目。

我试图创建一个数据库,其中作者有很多书。

为此,我写道:

class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name= db.Column(db.String(80))


class Books(db.Model):
id = db.Column(db.Integer, primary_key=True)
author = db.Column(db.Integer, db.ForeignKey('author.id'))


第一个问题:这是正确的方法吗?

第二个问题:我想知道每个作者写过哪些书-我该怎么做?

第三个问题:假设每本书可以由很多作者撰写,
我怎么知道哪位作者写了一本书?

我预先感谢

最佳答案

第一个问题:这是正确的方法吗?

几乎正确。您还应该创建一个中间模型来存储实际关系。由于它是many-to-many relationship,因此需要第三张表才能运行。

第二个问题:我想知道每个作者写过哪些书-我该怎么做?
第三个问题:可以说每本书可以由很多作者写,我怎么知道哪些作者写了一本书?

您可以使用SQLAlchemy的association proxy轻松实现。
像这样:

from myapp import db

from sqlalchemy.ext.associationproxy import association_proxy


class Book(db.Model):
__tablename__ = 'book'

id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(60))

# access all authors of that book
authors = association_proxy('bookauthor', 'author', creator=lambda author: BookAuthor(author=author))

def __init__(self, title):
self.title = title

def __unicode__(self):
return '<Book {0}>'.format(self.id)


class Author(db.Model):
__tablename__ = 'author'

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))

# access all books w/ this author
books = association_proxy('bookauthor', 'book', creator=lambda book: BookAuthor(book=book))

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

def __unicode__(self):
return '<Author {0}>'.format(self.id)


class BookAuthor(db.Model):
""" This is an association table for the Book<->Author Many to Many relationship. """
__tablename__ = 'book_author'

id = db.Column(db.Integer, primary_key=True)

id_book = db.Column(db.Integer, db.ForeignKey('book.id'), primary_key=True)
id_author = db.Column(db.Integer, db.ForeignKey('author.id'), primary_key=True)

# you can also access these objects of books and authors respectively
book = db.relationship(Book, backref='bookauthor')
author = db.relationship(Author, backref='bookauthor')

def __unicode__(self):
return '<BookAuthor {0}>'.format(self.id)

这样您便可以使用以下方法访问该书的所有作者:
book = db.session.query(Book).filter_by(title="The Catcher in the Rye")
book.authors()
# [<Author 'J. D. Salinger'>]

关于flask - 如何定义一个SQLAlchemy多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28301917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com