如何在SQLAlchemy中创建带有外键列表的字段?

mod*_*tos 3 python postgresql sqlalchemy foreign-keys foreign-key-relationship

我正在尝试在另一个模型的字段中存储模型列表。以下是一个简单的示例,其中我有一个现有模型Actor,并且我想Movie使用字段创建一个新模型Movie.list_of_actors

import uuid

from sqlalchemy import Boolean, Column, Integer, String, DateTime
from sqlalchemy.schema import ForeignKey
rom sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()


class Actor(Base):
    __tablename__ = 'actors'

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String)
    nickname = Column(String)
    academy_awards = Column(Integer)


# This is my new model:
class Movie(Base):
    __tablename__ = 'movies'

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    title = Column(String)
    # How do I make this a list of foreign keys???
    list_of_actors = Column(UUID(as_uuid=True), ForeignKey('actors.id'))
Run Code Online (Sandbox Code Playgroud)

我了解这可以通过多对多关系来完成,但是有没有更简单的解决方案?请注意,我不需要查找其Movie的一个Actor -我只是想创建一个新的Movie模型和访问我的名单Actor的。理想情况下,我希望不要在Actor模型中添加任何新字段。

我已经使用关系API遍历了这些教程,该API概述了使用back_propagatesbackref在此处的各种一对多/多对多组合:http : //docs.sqlalchemy.org/en/latest/orm/basic_relationships。 html但是,如果不创建成熟的多对多实现,我似乎无法实现我的外键列表。

但是,如果进行多对多实施是唯一的方法,是否有一种无需创建“关联表”的方式来实现它的方法?此处描述了“关联表”:http : //docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#many-to-many?无论哪种方式,一个示例都将非常有帮助!


另外,如果有关系,我正在使用Postgres 9.5。我从这篇文章中看到Postgres中可能支持数组,因此对此有任何想法可能会有所帮助。

更新资料

看起来这里唯一合理的方法是创建关联表,如下面的选定答案所示。我尝试使用SQLAlchemy的Postgres方言中的ARRAY,但它似乎不支持外键。在上面的示例中,我使用了以下列:

list_of_actors = Column('actors', postgresql.ARRAY(ForeignKey('actors.id')))
Run Code Online (Sandbox Code Playgroud)

但这给我一个错误。似乎对带有外键的Postgres ARRAY的支持正在进行中,但仍不完全支持。这是我发现的最新信息来源:http : //blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/

Kar*_*bet 6

如果要将许多演员与电影关联,并且将许多电影与演员关联,则需要多对多。这意味着您需要一个关联表。否则,您可能会放弃规范化并使用NoSQL数据库。

关联表解决方案可能类似于:

class Actor(Base):
    __tablename__ = 'actors'

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String)
    nickname = Column(String)
    academy_awards = Column(Integer)

class Movie(Base):
    __tablename__ = 'movies'

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    title = Column(String)

    actors = relationship('ActorMovie', uselist=True, backref='movies')

class ActorMovie(Base):
    __tablename__ = 'actor_movies'

    actor_id = Column(UUID(as_uuid=True), ForeignKey('actors.id'))
    movie_id = Column(UUID(as_uuid=True), ForeignKey('movies.id'))
Run Code Online (Sandbox Code Playgroud)

如果您不希望ActorMovie是继承自Base的对象,则可以使用sqlachlemy.schema.Table