2011-10-25 12 views
8

जब मैं कथात्मक ORM कई-से-अनेक संबंध से एक वस्तु को हटाने की जरूरत है, मैं इस क्या करना चाहिए:SqlAlchemy में कई से कई संग्रहों से सभी वस्तुओं को कैसे निकालें?

blogpost.tags.remove(tag) 

खैर। मुझे क्या करना चाहिए यदि मुझे इन सभी संबंधों को शुद्ध करने की आवश्यकता है (केवल एक ही नहीं)? विशिष्ट स्थिति: मैं अपने ब्लॉग पोस्ट में टैग की एक नई सूची सेट करना चाहता हूं।

  1. सभी मौजूदा संबंधों कि ब्लॉग पोस्ट और टैग के बीच निकालें: तो मैं ... की जरूरत है।
  2. नए संबंध सेट करें और यदि वे मौजूद नहीं हैं तो नए टैग बनाएं।

बेशक, ऐसा करने का एक बेहतर तरीका हो सकता है। उस मामले में कृपया मुझे बताएं।

उत्तर

18

यह एक सूची समाशोधन के लिए मानक अजगर मुहावरा है - टुकड़ा "पूरी सूची" करने के लिए बताए:

blogpost.tags[:] = [] 
खाली सूची के बजाय

, आप सीधे टैग के नए सेट आवंटित कर सकते हैं।

blogpost.tags[:] = new_tags 

SQLAlchemy के संबंधों instrumented attributes हैं, जिसका अर्थ है कि वे एक सूची (या निर्धारित करते हैं, dict, आदि) के इंटरफेस रखने के लिए, लेकिन कोई भी परिवर्तन डेटाबेस में परिलक्षित होते हैं। इसका मतलब है कि किसी भी सूची के साथ आप जो कुछ भी कर सकते हैं वह संबंध के साथ संभव है, जबकि एसक्यूएलए पारदर्शी रूप से परिवर्तनों को सुनता है और डेटाबेस के अनुसार अद्यतन करता है।

+7

या इसे अन्यथा डालें: SQLAlchemy शानदार है। – ereOn

+1

क्यों न सिर्फ 'blogpost.tags = new_tags'? (बिना [:]) – Devi

+1

जब मैं इसे आजमाता हूं (दिसंबर 2014, SQLAlchemy 0.9) मुझे "TypeError: 'AppenderBaseQuery' ऑब्जेक्ट आइटम असाइनमेंट का समर्थन नहीं करता है।" –

5

Two-Bit Alchemist के लिए भरोसा किया गया है।

blogpost.tags[:] = new_tags 

शिकायत के बारे में

TypeError: 'AppenderBaseQuery' object does not support item assignment 

लेकिन

blogpost.tags = new_tags 

ठीक से काम करने लगता है।

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