2010-10-21 11 views
5

मुझे खेद है कि अगर उलटा पसंदीदा नामकरण नहीं है, जो मेरी खोज में बाधा डाल सकता है। किसी भी मामले में, मैं दो स्क्लेल्चेमी घोषणात्मक कक्षाओं से निपट रहा हूं, जो कि कई से अधिक रिश्ते हैं। पहला खाता है, और दूसरा संग्रह है। उपयोगकर्ता "खरीद" संग्रह, लेकिन मैं उपयोगकर्ता को पहले 10 संग्रह दिखाना चाहता हूं उपयोगकर्ता अभी तक खरीदा नहीं गया है।sqlalchemy कई से कई, लेकिन उलटा?

from sqlalchemy import * 
from sqlalchemy.orm import scoped_session, sessionmaker, relation 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

engine = create_engine('sqlite:///:memory:', echo=True) 
Session = sessionmaker(bind=engine) 

account_to_collection_map = Table('account_to_collection_map', Base.metadata, 
           Column('account_id', Integer, ForeignKey('account.id')), 
           Column('collection_id', Integer, ForeignKey('collection.id'))) 

class Account(Base): 
    __tablename__ = 'account' 

    id = Column(Integer, primary_key=True) 
    email = Column(String) 

    collections = relation("Collection", secondary=account_to_collection_map) 

    # use only for querying? 
    dyn_coll = relation("Collection", secondary=account_to_collection_map, lazy='dynamic') 

    def __init__(self, email): 
     self.email = email 

    def __repr__(self): 
     return "<Acc(id=%s email=%s)>" % (self.id, self.email) 

class Collection(Base): 
    __tablename__ = 'collection' 

    id = Column(Integer, primary_key=True) 
    slug = Column(String) 

    def __init__(self, slug): 
     self.slug = slug 

    def __repr__(self): 
     return "<Coll(id=%s slug=%s)>" % (self.id, self.slug) 

तो, account.collections के साथ, मैं सभी संग्रह प्राप्त कर सकते हैं, और साथ dyn_coll.limit (1) सब के सब() मैं संग्रह की सूची में प्रश्नों आवेदन कर सकते हैं ... लेकिन मैं कैसे करते हो श्लोक में? मैं पहले 10 संग्रह प्राप्त करना चाहता हूं कि खाता मैप किया गया है।

किसी भी मदद की सराहना की जाती है। धन्यवाद!

उत्तर

5

मैं इस उद्देश्य के लिए रिश्ते का उपयोग नहीं करता, क्योंकि तकनीकी रूप से यह आपके द्वारा निर्मित रिश्ते नहीं है (इसलिए दोनों तरफ सिंक्रनाइज़ करने की सभी चालें काम नहीं करतीं)।

class Account(Base): 
    ... 
    # please note added *backref*, which is needed to build the 
    #query in Account.get_other_collections(...) 
    collections = relation("Collection", secondary=account_to_collection_map, backref="accounts") 

    def get_other_collections(self, maxrows=None): 
     """ Returns the collections this Account does not have yet. """ 
     q = Session.object_session(self).query(Collection) 
     q = q.filter(~Collection.accounts.any(id=self.id)) 
     # note: you might also want to order the results 
     return q[:maxrows] if maxrows else q.all() 
... 
+0

हुह:
IMO, स्पष्ट तरीका एक सरल प्रश्न जो आप वस्तुओं आप देख रहे हैं वापस आ जाएगी परिभाषित करने के लिए किया जाएगा। मुझे स्पष्ट रूप से sqlalchemy के बारे में जानने के लिए बहुत कुछ है। :) धन्यवाद! – Hoopes

संबंधित मुद्दे