Python 如何从sqlalchemy中的关系中获取列表的dict?

Python 如何从sqlalchemy中的关系中获取列表的dict?,python,dictionary,sqlalchemy,relationship,Python,Dictionary,Sqlalchemy,Relationship,我发现可以在关系中使用集合来更改返回值的类型,特别是我对字典感兴趣。 文件提供了一个: 它是有效的。然而,我希望如果有不止一个键具有相同的名称,它将生成列表值。但它只将最后一个值放在唯一的键名下 以下是一个例子: | Note table | |---------------------|------------------| | id | keyword | |-------------

我发现可以在关系中使用集合来更改返回值的类型,特别是我对字典感兴趣。 文件提供了一个:

它是有效的。然而,我希望如果有不止一个键具有相同的名称,它将生成列表值。但它只将最后一个值放在唯一的键名下

以下是一个例子:

|               Note table               |
|---------------------|------------------|
|          id         |      keyword     |
|---------------------|------------------|
|          1          |        foo       |
|---------------------|------------------|
|          2          |        foo       |
|---------------------|------------------|
|          3          |        bar       |
|---------------------|------------------|
|          4          |        bar       |
|---------------------|------------------|
item.notes
将返回如下内容:

{'foo': <project.models.note.Note at 0x7fc6840fadd2>,
 'bar': <project.models.note.Note at 0x7fc6840fadd4>}
{'foo': [<project.models.note.Note at 0x7fc6840fadd1,
          <project.models.note.Note at 0x7fc6840fadd2>],
 'bar': [<project.models.note.Note at 0x7fc6840fadd3>,
         <project.models.note.Note at 0x7fc6840fadd4>]}
{'foo':,
'bar':}
其中,foo和bar对象的ID分别为2和4

我想要的是得到这样的东西:

{'foo': <project.models.note.Note at 0x7fc6840fadd2>,
 'bar': <project.models.note.Note at 0x7fc6840fadd4>}
{'foo': [<project.models.note.Note at 0x7fc6840fadd1,
          <project.models.note.Note at 0x7fc6840fadd2>],
 'bar': [<project.models.note.Note at 0x7fc6840fadd3>,
         <project.models.note.Note at 0x7fc6840fadd4>]}

{'foo':[因此,事实证明,您可以简单地继承MappedCollection并在那里执行您喜欢的任何操作

from sqlalchemy.orm.collections import (MappedCollection,
                                        _SerializableAttrGetter,
                                        collection,
                                        _instrument_class)

#This will ensure that the MappedCollection has been properly 
#initialized with custom __setitem__() and __delitem__() methods 
#before used in a custom subclass
_instrument_class(MappedCollection)


class DictOfListsCollection(MappedCollection):

    @collection.internally_instrumented
    def __setitem__(self, key, value, _sa_initiator=None):
        if not super(DictOfListsCollection, self).get(key):
            super(DictOfListsCollection, self).__setitem__(key, [], _sa_initiator)
        super(DictOfListsCollection, self).__getitem__(key).append(value)

请修复您的缩进并给出输入和输出示例编辑:添加了一个示例并修复了缩进对于将来遇到此问题的任何人,下面是一个更完整的示例,说明我是如何根据@keipa glows的工作获得此工作的: