【发布时间】:2017-02-27 12:09:28
【问题描述】:
我正在尝试在另一个模型的字段中存储模型列表。下面是一个简单的示例,我有一个现有模型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'))
我知道这可以通过多对多关系来完成,但是有更简单的解决方案吗? 请注意,我不需要查找Movie 和Actor 所在的位置 - 我只想创建一个新的Movie 模型并访问我的Actor 列表的。理想情况下,我不希望在我的 Actor 模型中添加任何新字段。
我已经阅读了使用relationships API 的教程,其中概述了使用back_propagates 和backref 的各种一对多/多对多组合: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。我从this post 看到,Postgres 中可能支持数组,因此对此的任何想法都会有所帮助。
更新
看起来这里唯一合理的方法是创建一个关联表,如下面的选定答案所示。我尝试使用ARRAY from SQLAlchemy's Postgres Dialect,但它似乎不支持外键。在上面的示例中,我使用了以下列:
list_of_actors = Column('actors', postgresql.ARRAY(ForeignKey('actors.id')))
但它给了我一个错误。似乎对带有外键的 Postgres ARRAY 的支持正在进行中,但仍然不完全存在。以下是我发现的最新信息来源:http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/
【问题讨论】:
-
如果有人遇到类似问题,这里是另一个与 Flask 相关的示例:blog.miguelgrinberg.com/post/…
标签: python postgresql sqlalchemy foreign-keys foreign-key-relationship