Python SQLAlchemy-如何创建一对多的关系而不使用任何项目?

Python SQLAlchemy-如何创建一对多的关系而不使用任何项目?,python,python-3.x,orm,sqlalchemy,Python,Python 3.x,Orm,Sqlalchemy,我正在尝试在SQLAlchemy中创建一个对象,该对象可以与许多项建立关系,但不必这样。这是我的模型文件: 来自sqlalchemy.ext.declarative import declarative\u base 从sqlalchemy.orm导入关系 从sqlalchemy导入列、字符串、整数、外键 Base=声明性_Base() 类媒体(基本): __tablename_=“媒体” id=列(整数、主键=真、唯一=真、自动递增=真) 视频id=列(字符串) 音频=关系(“音频”,背面填充

我正在尝试在SQLAlchemy中创建一个对象,该对象可以与许多项建立关系,但不必这样。这是我的模型文件:

来自sqlalchemy.ext.declarative import declarative\u base
从sqlalchemy.orm导入关系
从sqlalchemy导入列、字符串、整数、外键
Base=声明性_Base()
类媒体(基本):
__tablename_=“媒体”
id=列(整数、主键=真、唯一=真、自动递增=真)
视频id=列(字符串)
音频=关系(“音频”,背面填充=“媒体”)
类音频(基本):
__tablename_=“audio”
id=列(整数、主键=真、唯一=真、自动递增=真)
media\u id=列(整数,ForeignKey(“media.id”))
媒体=关系(“媒体”,背面填充=“音频”)
这将创建从媒体到音频的一对多关系。但是,当我尝试使用
[]
None
作为参数创建媒体项时,它会出错。以下是我正在做的:

new\u media\u item=media(
video\u id=some\u video\u id,
audio=None#我也尝试过[]或只是没有指定音频
)
但我得到了这个错误:

Traceback (most recent call last):
  --- some cli code, snipped ---
  File "cool_program.py", line 30, in do_add_media
    audio = None
  File "<string>", line 2, in __init__
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 376, in _new_state_if_none
    state = self._state_constructor(instance, self)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py", line 202, in _state_constructor
    self.dispatch.first_init(self, self.class_)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/event/attr.py", line 322, in __call__
    fn(*args, **kw)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3361, in _event_on_first_init
    configure_mappers()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 3249, in configure_mappers
    mapper._post_configure_properties()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py", line 1947, in _post_configure_properties
    prop.init()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/interfaces.py", line 196, in init
    self.do_init()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1914, in do_init
    self._process_dependent_arguments()
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1976, in _process_dependent_arguments
    self.target = self.entity.persist_selectable
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 855, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/home/spazzlo/.local/lib/python3.6/site-packages/sqlalchemy/orm/relationships.py", line 1899, in entity
    % (self.key, type(argument))
sqlalchemy.exc.ArgumentError: relationship 'audio' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)
回溯(最近一次呼叫最后一次):
---一些cli代码被剪掉了---
文件“cool_program.py”,第30行,在do_add_介质中
音频=无
文件“”,第2行,在_init中__
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/instrumentation.py”,第376行,处于“新”状态(如果没有)
state=self.\u state\u构造函数(实例,self)
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/util/langhelpers.py”,第855行,在__
obj.\uuuuu dict\uuuuu[self.\uuuuuuuuuuu name\uuuuuuuuu]=结果=self.fget(obj)
文件“/home/spazzo/.local/lib/python3.6/site-packages/sqlalchemy/orm/instrumentation.py”,第202行,在构造函数中
self.dispatch.first_init(self,self.class_)
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/event/attr.py”,第322行,在调用中__
fn(*参数,**千瓦)
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/mapper.py”,第3361行,在初始事件中
配置映射器()
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/mapper.py”,第3249行,在configure_mappers中
映射程序。_post_configure_properties()
文件“/home/spazzo/.local/lib/python3.6/site-packages/sqlalchemy/orm/mapper.py”,第1947行,在“post\u-configure\u-properties”中
prop.init()
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/interfaces.py”,第196行,在init中
self.do_init()
do_init中的文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/relationships.py”,第1914行
self.\u进程\依赖\参数()
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/relationships.py”,第1976行,在进程相关参数中
self.target=self.entity.persist\u可选
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/util/langhelpers.py”,第855行,在__
obj.\uuuuu dict\uuuuu[self.\uuuuuuuuuuu name\uuuuuuuuu]=结果=self.fget(obj)
文件“/home/spazzo/.local/lib/python3.6/site packages/sqlalchemy/orm/relationships.py”,第1899行,在实体中
%(self.key,类型(参数))
sqlalchemy.exc.ArgumentError:关系“audio”需要一个类或映射器参数(收到:)

您应该指向关系中的类名,而不是表名:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import Column, String, Integer, ForeignKey

Base = declarative_base()

class Media(Base):

    __tablename__ = "media"
    id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    video_id = Column(String)
    audio = relationship("Audio", back_populates="media")  # changed 'audio' to 'Audio'

class Audio(Base):

    __tablename__ = "audio"
    id = Column(Integer, primary_key=True, unique=True, autoincrement=True)
    media_id = Column(Integer, ForeignKey("media.id"), nullable=True)
    media = relationship("Media", back_populates="audio")