我可以将同一对象两次附加到 SQLAlchemy 中的 InstrumentedList 中吗?

2023-12-02

我在 SqlAlchemy 0.6.6 中有一个非常简单的 N:M 关系。我有一个“attractLoop”类,它可以包含一堆媒体(图像或视频)。我需要一个列表,其中相同的媒体(比如说图像)可以附加两次。关系如下:

媒体是一个基类,具有图像和视频将共享的大部分属性。

class BaseMedia(BaseClass.BaseClass, declarativeBase):
    __tablename__ = "base_media"
    _polymorphicIdentity = Column("polymorphic_identity", String(20), key="polymorphicIdentity")
    __mapper_args__ = {
        'polymorphic_on': _polymorphicIdentity,
        'polymorphic_identity': None
    }

    _name = Column("name", String(50))
    _type = Column("type", String(50))
    _size = Column("size", Integer)
    _lastModified = Column("last_modified", DateTime, key="lastModified")
    _url = Column("url", String(512))
    _thumbnailFile = Column("thumbnail_file", String(512), key="thumbnailFile")
    _md5Hash = Column("md5_hash", LargeBinary(32), key="md5Hash")

然后是要使用这些“媒体”东西的类:

class TestSqlAlchemyList(BaseClass.BaseClass, declarativeBase):
    __tablename__ = "tests"
    _mediaItems = relationship("BaseMedia",
                               secondary=intermediate_test_to_media,
                               primaryjoin="tests.c.id == intermediate_test_to_media.c.testId",
                               secondaryjoin="base_media.c.id == intermediate_test_to_media.c.baseMediaId",
                               collection_class=list,
                               uselist=True
                               )

    def __init__(self):
        super(TestSqlAlchemyList, self).__init__()
        self.mediaItems = list()

    def getMediaItems(self):
        return self._mediaItems

    def setMediaItems(self, mediaItems):
        if mediaItems:
            self._mediaItems = mediaItems
        else:
            self._mediaItems = list()

    def addMediaItem(self, mediaItem):
        self.mediaItems.append(mediaItem)
        #log.debug("::addMediaItem > Added media item %s to %s. Now length is %d (contains: %s)" % (mediaItem.id, self.id, len(self.mediaItems), list(item.id for item in self.mediaItems)))

    def addMediaItemById(self, mediaItemId):
        mediaItem = backlib.media.BaseMediaManager.BaseMediaManager.getById(int(mediaItemId))
        if mediaItem:
            if mediaItem.validityCheck():
                self.addMediaItem(mediaItem)
            else:
                raise TypeError("Media item with id %s didn't pass the validity check" % mediaItemId)
        else:
            raise KeyError("Media Item with id %s not found" % mediaItem)

    mediaItems = synonym('_mediaItems', descriptor=property(getMediaItems, setMediaItems))

以及链接两个表的中间类:

intermediate_test_to_media = Table(
                                   "intermediate_test_to_media",
                                   Database.Base.metadata,
                                   Column("id", Integer, primary_key=True),
                                   Column("test_id", Integer, ForeignKey("tests.id"), key="testId"),
                                   Column("base_media_id", Integer, ForeignKey("base_media.id"), key="baseMediaId")
                                   )

当我将同一个媒体对象(实例)两次附加到该 TestSqlAlchemyList 的一个实例时,它会正确附加两个,但是当我从数据库检索 TestSqlAlchemyList 实例时,我只得到一个。它的行为似乎更像是一个集合。

中间表正确地包含了所有信息,因此插入似乎工作正常。当我尝试从数据库加载列表时,我没有获得已插入的所有项目。

mysql> SELECT * FROM intermediate_test_to_media;
+----+---------+---------------+
| id | test_id | base_media_id |
+----+---------+---------------+
|  1 |       1 |             1 |
|  2 |       1 |             1 |
|  3 |       1 |             2 |
|  4 |       1 |             2 |
|  5 |       1 |             1 |
|  6 |       1 |             1 |
|  7 |       2 |             1 |
|  8 |       2 |             1 |
|  9 |       2 |             1 |
| 10 |       2 |             2 |
| 11 |       2 |             1 |
| 12 |       2 |             1 |

如您所见, id=1 的“测试”实例应该具有媒体 [1, 1, 2, 2, 1, 1]。嗯,事实并非如此。当我从数据库加载它时,它只有媒体 [1, 2]

我试图在关系中设置任何可能闻到列表的参数... uselist, collection_class = list... 什么都没有...

您将看到这些类继承自 BaseClass。这只是一个类,实际上并未映射到任何表,但包含一个数字字段(“id”),该字段将成为每个类的主键,以及一堆对我系统中其余类有用的其他方法(toJSON ,到XML...)。以防万一,我附上它的摘录:

class BaseClass(object):
    _id = Column("id", Integer, primary_key=True, key="id")
    def __hash__(self):
        return int(self.id)

    def setId(self, id):
            try:
                    self._id = int(id)
            except TypeError:
                    self._id = None

    def getId(self):
        return self._id

    @declared_attr
    def id(cls):
        return synonym('_id', descriptor=property(cls.getId, cls.setId))

如果有人可以推动我,我将非常感激。谢谢。对于这么大的帖子,我深表歉意……我真的不知道如何更好地解释。


我认为您想要的在文档中描述为“多对多关系中的额外字段“。您可以存储单个关联并指定(作为链接对象模型的一部分)它被引用的次数和/或在其中被引用的次数,而不是在数据库中为每个“链接”存储一个唯一的行,在吸引循环和媒体之间媒体应该出现在最终列表中的位置。这与您开始的地方不同,因此它肯定需要一些重新编码,但我认为它解决了您的问题。您可能需要使用属性重新定义如何在attactLoop中添加或删除媒体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将同一对象两次附加到 SQLAlchemy 中的 InstrumentedList 中吗? 的相关文章

  • 向 polls urls.py 添加额外的过滤器会导致测试失败

    按照 djangoproject 的教程 我尝试让 urls py 过滤掉没有选择下面 urlpattern 的民意调查 urlpatterns patterns url r ListView as view queryset Poll o
  • 在 Django 中获取数据库类型[重复]

    这个问题在这里已经有答案了 我需要能够确定 Django 运行时使用的数据库类型 MYSQL False if
  • sphinx 中的分组方法文档字符串

    是否可以使用 sphinx 的 autodoc 功能将多个方法文档字符串分组 以便将它们列在一起 class Test object def a self A method of group foo def b self A method
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • 查找 python 数据框中每行的最高值

    我想找到每行中的最高值并返回 python 中该值的列标题 例如 我想找到每行的前两个 df A B C D 5 9 8 2 4 1 2 3 我希望我的输出看起来像这样 df B C A D 您可以使用字典理解来生成largest n数据帧
  • Python pandas:删除字符串中分隔符之后的所有内容

    我有数据框 其中包含例如 vendor a ProductA vendor b ProductA vendor a Productb 我需要删除所有内容 包括 两个 以便我最终得到 vendor a vendor b vendor a 我尝
  • 检查多维 numpy 数组的所有边是否都是零数组

    n 维数组有 2n 个边 1 维数组有 2 个端点 2 维数组有 4 个边或边 3 维数组有 6 个 2 维面 4 维数组有 8 个边 ETC 这类似于抽象 n 维立方体发生的情况 我想检查 n 维数组的所有边是否仅由零组成 以下是边由零组
  • Highcharts 奇怪的分组行为

    我正在使用延迟加载 http www highcharts com stock demo lazy loading加载 OHLC 数据的方法 在服务器端 我使用 Python MySQL 并有 4 个包含 OHLC 数据的表 时间间隔为 5
  • 使用Python进行图像识别[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个想法 就是我想识别图像中的字母 可能是 bmp或 jpg 例如 这是一个包含字母 S 的 bmp 图像 我想做的是使用Pyth
  • 将分布拟合到直方图

    I want to know the distribution of my data points so first I plotted the histogram of my data My histogram looks like th
  • 什么时候用==,什么时候用is?

    奇怪的是 gt gt gt a 123 gt gt gt b 123 gt gt gt a is b True gt gt gt a 123 gt gt gt b 123 gt gt gt a is b False Seems a is b
  • 获取 HTML 代码的结构

    我正在使用 BeautifulSoup4 我很好奇是否有一个函数可以返回 HTML 代码的结构 有序标签 这是一个例子 h1 Simple example h1 p This is a simple example of html page
  • PyPI 上的轮子平台约束有什么限制吗?

    是否有任何地方 PEP 或其他地方 声明关于 Linux 轮子上传范围的限制 PyPI http pypi io 应该有 具体来说 上传是否被认为是可接受的做法linux x86 64轮子到 PyPI 而不是manylinux1 x86 6
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 使用 plone.api 创建文件的 Python 脚本在设置文件时出现错误 WrongType

    Dears 我正在创建一个脚本python来在Plone站点中批量上传文件 安装是UnifiedInstaller Plone 4 3 10 该脚本读取了一个txt 并且该txt以分号分隔 在新创建的项目中设置文件时出现错误 下面是脚本 f
  • Docker Build 找不到 pip

    尝试关注一些 1 https aws amazon com blogs aws run docker apps locally using the elastic beanstalk eb cli 2 http docs aws amazo
  • 为什么 tesseract 无法从这个简单的图像中读取文本?

    我在 pytesseract 上阅读了大量的帖子 但我无法让它从一个简单的图像中读取文本 它返回一个空字符串 这是图像 我尝试过缩放它 灰度化它 调整对比度 阈值 模糊 以及其他帖子中所说的一切 但我的问题是我不知道 OCR 想要更好地工作
  • R 中的整数或双精度列表

    我有一个大约 1000 个整数的列表 我需要能够进行一些数学计算 但它们被困在列表或字符形式中 我怎样才能切换它们以便它们可用 样本数据 gt y 1 1 7 3 1 6 7 1 7 6 5 3 1 3 3 0 6 2 4 9 19 1 9
  • 在哪里可以找到Python内置序列类型的时间和空间复杂度

    我一直无法找到此信息的来源 无法亲自查看 Python 源代码来确定这些对象是如何工作的 有谁知道我可以在网上找到这个吗 结帐时间复杂度 http wiki python org moin TimeComplexitypy dot org

随机推荐

  • 如何使用 Bundle 在 Activity 之间传递 Uri 数组

    我需要将 Uri 数组传递给另一个活动 传递一个我简单使用的字符串数组 String images getImagesPathString Bundle b new Bundle b putStringArray images images
  • 如何向 UIToolBar 添加图像?

    我想将图像添加到用户无法与之交互的 UIToolBar 它本质上只是一个非交互式指示器 就像徽章一样 这可能吗 如果是这样 怎么办 创建一个UIBarButtonItem使用图像并添加它 Example UIBarButtonItem it
  • 处理按钮外部的点击事件

    我正在尝试通过重现 Apple AppStore 中的应用程序来练习 C 在应用程序中 有一个带有文本的矩形 Touch me 当您触摸它时 矩形会自行重新定位 执行此操作几次后 文本将更改为 不要碰我 在这种情况下 您必须触摸矩形之外 一
  • Pyspark 向数据帧添加顺序和确定性索引

    我需要向数据帧添加一个索引列 并具有三个非常简单的约束 从0开始 是连续的 具有确定性 我确信我错过了一些明显的东西 因为我发现的例子对于这样一个简单的任务来说看起来非常复杂 或者使用非顺序 非确定性越来越单调的 id 我不想使用索引进行压
  • 在 Swift 2 中对字典数组进行排序

    我读过很多关于SO的文章 但我仍然感到困惑 我有一系列字典 见下文 var myArray String AnyObject myArray append caseNumber 12349 formType Advanced caseSta
  • python 将本地时间字符串转换为 UTC 纪元时间戳

    我有 YMD hms 格式的字符串 其中删除了时区 但我知道他们现在是东部时间 有夏令时 我正在尝试将它们转换为 UTC 时间的纪元时间戳 我写了以下函数 def ymdhms timezone dst to epoch input str
  • Java Apache POI 打开文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个 Java 程序 可以编辑现有的 Excel 文件并将其另存为新文件 但是 我还希望程序在结束时自动打开新创建的文件 是否有 apache poi 命令可以让我执行此操作 由
  • Rails ActionMailer 中的 Net::SMTPAuthenticationError 502 5.5.2

    我正在尝试向用户发送确认电子邮件 但我收到以下错误 Net SMTPAuthenticationError 502 5 5 2 错误 命令无法识别 Production rb中的配置如下 Disable delivery errors ba
  • 原型声明和前向声明之间的区别?

    所以我有这个代码 class xx int getnum Is this a forward declaration or a prototype declaration and why int xx getnum return 1 3 所
  • 在 Ubuntu 14.10 中安装 OpenCV

    我正在尝试根据以下方法在 Ubuntu 14 10 中安装 OpenCV操作说明 我安装了所有提到的依赖项 但是当我尝试运行时make我收到这样的错误 home ilia opencv 2 4 8 modules highgui src f
  • JSON 插入 MySQL 表或更新(如果存在)

    这是继续插入 MySQL 表或更新 如果存在 但是这次我想更新mysql中的json条目 下面是架构 CREATE TABLE TAG COUNTER account varchar 36 NOT NULL time id INT NOT
  • 如何正确使用 addCustomRequestHeader

    我正在尝试将标题添加到我的HTTP请求特定的测试用例 这非常重要 因为我正在尝试测试要在手机中使用的应用程序 我设法找到了方法addCustomRequestHeader String arg0 String arg1 不幸的是 我似乎不知
  • 如何在我的 ModelInput 类中使用 Joshua Bloch 版本所描述的 Builder 模式?

    我正在尝试对下面的类使用 Builder 模式 最初 我使用类的构造函数来设置所有参数 但意外地我遇到了 Builder 模式 它看起来很适合我的用例 下面是我的课程 大多数人都会通过userId clientId and paramete
  • 从 fill_ Between 的 PolyCollection 中提取 x/y 数据

    如何从生成的 PolyCollection 中提取 x y 数据fill between plot polyCollection ax fill between x ylo yhi 现在我如何从polyCollection 对于他人Coll
  • @DynamoDBAttribute 注释不起作用

    我有一个名为 opx user profiles 的 dynamodb 表 该实体如下所示 但属性 user profile id 在表中保存为 userProfileID 即使在属性上指定了 DynamoDBAttribute attri
  • 未定义的复杂类型“java.lang.Object”用作复杂类型扩展的基础

    我在 Android 应用程序的 xml 源文件中有非常简单的布局 我使用此布局来添加动态 TextView 和按钮 应用程序工作正常 尽管我收到警告 第 6 行 第 8 列 未定义的complexType java lang Object
  • 简单神经网络中的奇怪收敛

    一段时间以来 我一直在努力用 Java 构建一个简单的神经网络 我已经断断续续地致力于这个项目几个月了 我想完成它 我的主要问题是我不知道如何正确实现反向传播 所有来源都使用 Python 数学术语 或者过于简单地解释这个想法 今天我尝试自
  • Chrome 扩展:如何在新选项卡中显示背景图片

    我愿意拥有类似的功能 例如 Moments 或 Limitless 等流行扩展中提供的类似功能 它们显示美丽的壁纸 我该如何实施 另外 如果安装了多个类似的扩展程序 这些扩展程序在新选项卡上显示图像 有没有办法让 chrome 首先在选项卡
  • 如何从输入标签中获取文本?

    我有一个案例 我必须从中获取文本input标签类似于
  • 我可以将同一对象两次附加到 SQLAlchemy 中的 InstrumentedList 中吗?

    我在 SqlAlchemy 0 6 6 中有一个非常简单的 N M 关系 我有一个 attractLoop 类 它可以包含一堆媒体 图像或视频 我需要一个列表 其中相同的媒体 比如说图像 可以附加两次 关系如下 媒体是一个基类 具有图像和视