2011-09-03 42 views
9

मैं बस सीख रहा हूं कि स्क्लाक्लेमी का उपयोग कैसे करें। मैं निम्नलिखित करने के लिए कोशिश कर रहा हूँ, लेकिन शीर्षक और दो अलग-अलग तालिकाओं में लिंक भंडारण:विशेषताएँ त्रुटि: 'यूनिकोड' ऑब्जेक्ट में कोई विशेषता नहीं है '_sa_instance_state'

temp = Submissions(title=u'Facebook Homepage', link=u'http://facebook.com') 
session.add(temp) 
session.flush() 
transaction.commit() 

के माध्यम से:

AttributeError: 'unicode' object has no attribute '_sa_instance_state' 

:

class Links(Base): 
    __tablename__ = 'links' 
    id = Column(Integer, primary_key=True) 
    link = Column(Text) 
    created = Column(TIMESTAMP(), default=datetime.now()) 

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

class Submissions(Base): 
    __tablename__ = 'submissions' 
    id = Column(Integer, primary_key=True) 
    created = Column(TIMESTAMP(), default=datetime.now()) 
    title = Column(Text) 
    link_id = Column(Integer, ForeignKey('links.id')) 
    link = relation(Links) 

    def __init__(self, title, link): 
     self.title = title 
     self.link = link 

हालांकि, मैं हमेशा इस त्रुटि मिलती है क्या हो रहा है? क्या इसे कोड करने का कोई बेहतर तरीका है?

उत्तर

9

आप relationship के साथ ऐसा नहीं कर सकते हैं।

आपको किसी भी तरह से देखने के लिए Link की व्यवस्था करने की आवश्यकता है।

सबसे स्पष्ट यह है कि इसे सीधे देखें।

submission_link = session.query(Links) \ 
         .filter(Links.link == u'http://facebook.com') \ 
         .first() 
if submission_link is None: 
    submission_link = Links(link=u'http://facebook.com') 
    session.add(submission_link) 

submission = Submissions(title=u'Facebook Homepage', link=submission_link) 
session.add(submission) 
session.commit() 

तुम भी hybrid attributes का उपयोग कुछ है कि आपके उदाहरण की तरह थोड़ा अधिक लग रहा है, लेकिन इसकी काफी अधिक जटिल पाने के लिए कर सकते हैं।

भी, यह relationship है, relation बहिष्कृत है।

+0

धन्यवाद, बस वही है जो मुझे चाहिए। –

+1

यह 'session.add (सबमिशन) 'नहीं होना चाहिए? –

2

मैं one-to-one (uselist=False) के रूप में संबंध कॉन्फ़िगर हैं और एक संपत्ति जो link संबंध लपेटो जाएगा जोड़ें। एसए कॉन्फ़िगरेशन तब नीचे दिखेगा और आपके कोड को लिंक बनाने, अपडेट करने और हटाने को ठीक से काम करना चाहिए। cascade में आपको delete-orphan विकल्प के लिए संबंध कॉन्फ़िगर करने की आवश्यकता हो सकती है।

... 
class Submissions(Base): 
    __tablename__ = 'submissions' 
    id = Column(Integer, primary_key=True) 
    created = Column(DateTime(), default=datetime.now()) 
    title = Column(Text) 
    link_id = Column(Integer, ForeignKey('links.id')) 
    link_rel = relation(Links, backref=backref("_submission", uselist=False)) 

    def __init__(self, title, link=None): 
     self.title = title 
     self.link = link 

    @property 
    def link(self): 
     return self.link_rel and self.link_rel.link 

    @link.setter 
    def link(self, value): 
     if value is None: 
      self.link_rel = None 
     elif self.link_rel is None: 
      self.link_rel = Links(value) 
     else: 
      self.link_rel.link = value 
... 
+0

ऊपर नहीं जा सकता है, लेकिन यहां एक धन्यवाद है। दुर्भाग्य से मैं लिंक अलग कर रहा हूं क्योंकि सूची एक-एक-एक नहीं है। –

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

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