2016-08-04 24 views
2

Ich habe herausgefunden, dass Sie Sammlungen in Beziehung verwenden können, um den Typ des Rückgabewerts zu ändern, speziell war ich an Wörterbüchern interessiert. Dokumentation gibt ein Beispiel:Wie man Diktat von Listen von der Beziehung in sqlalchemy erhält?

class Item(Base): 
    __tablename__ = 'item' 
    id = Column(Integer, primary_key=True) 
    notes = relationship("Note", 
         collection_class=attribute_mapped_collection('keyword'), 
         cascade="all, delete-orphan") 

class Note(Base): 
    __tablename__ = 'note' 
    id = Column(Integer, primary_key=True) 
    item_id = Column(Integer, ForeignKey('item.id'), nullable=False) 
    keyword = Column(String) 
    text = Column(String) 

Und es funktioniert. Ich hatte jedoch gehofft, dass es Listenwerte erstellen wird, wenn es mehr als nur einen Schlüssel mit demselben Namen gibt. Es wird jedoch nur der letzte Wert unter dem eindeutigen Schlüsselnamen angezeigt. Hier

ein Beispiel:

|    Note table    | 
|---------------------|------------------| 
|   id   |  keyword  | 
|---------------------|------------------| 
|   1   |  foo  | 
|---------------------|------------------| 
|   2   |  foo  | 
|---------------------|------------------| 
|   3   |  bar  | 
|---------------------|------------------| 
|   4   |  bar  | 
|---------------------|------------------| 

item.notes wird in etwa so zurück:

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

Wo ids von foo und bar Objekte sind 2 bzw. 4.

Was ich suche ist, so etwas zu bekommen:

{'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>]} 

Ist es möglich, dict von Listen von Beziehung in sqlalchemy zu bekommen?

+0

Bitte korrigieren Sie Ihre Vertiefung und geben Ein- und Ausgabe Beispiel –

+1

Editiert: ein Beispiel gegeben und feste Vertiefung –

Antwort

2

So stellt sich heraus, Sie können MappedCollection einfach erben und tun, was auch immer Sie wollen in setitem dort.

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) 
+0

Für alle in der Zukunft in dieser Frage läuft, ist hier ein vollständigeres Beispiel dafür, wie habe ich diese Basis aus Arbeits @ Keipa-leuchtet 'Arbeit: https://gist.github.com/onecrayon/646da61accf54674d4f5098376a2c5df –