2009-06-28 20 views
6

में रिकर्सिव डिलीट मैं django 1.0.2 (और django-helper) के साथ Google ऐप इंजन का उपयोग कर रहा हूं और आश्चर्य करता हूं कि लोग रिकर्सिव डिलीट करने के बारे में कैसे जाते हैं। मान लीजिए आप एक मॉडल कुछ इस तरह है कि है:Google ऐप इंजन

 
class Top(BaseModel): 
    pass 

class Bottom(BaseModel): 
    daddy = db.ReferenceProperty(Top) 

अब, जब मैं प्रकार 'टॉप' की एक वस्तु को हटाते हैं, मैं चाहता हूँ सभी संबद्ध 'नीचे' वस्तुओं के रूप में अच्छी तरह से हटाए जाने के लिए।

जैसा कि चीजें अब हैं, जब मैं 'टॉप' ऑब्जेक्ट को हटाता हूं, तो 'नीचे' ऑब्जेक्ट्स रहती हैं और फिर मुझे डेटा मिलता है जो कहीं भी संबंधित नहीं होता है। मैं निश्चित रूप से सभी वस्तुओं को खोजने और उन्हें हटा सकता है

Caught an exception while rendering: ReferenceProperty failed to be resolved.

, लेकिन जब से मेरा असली मॉडल कम से कम 5 स्तर नीचे है, मैं वहाँ एक रास्ता है आशा करती हूं कि: जब एक दृश्य में डेटासंग्रह तक पहुँचने, मैं अंत यह सुनिश्चित करने के लिए कि यह स्वचालित रूप से किया जा सकता है।

मुझे यह article मिला है कि यह जावा के साथ कैसे काम करता है और ऐसा लगता है कि मैं जो भी चाहता हूं वह काफी सुंदर है।

कोई भी जानता है कि मैं django में भी उस व्यवहार को कैसे प्राप्त कर सकता हूं?

उत्तर

6

आपको प्रभावित रिकॉर्ड देखने और उन्हें उसी समय हटाने के लिए मैन्युअल रूप से इसे लागू करने की आवश्यकता है जब आप अभिभावक रिकॉर्ड हटाते हैं। यदि आप चाहें, तो आप अपने मूल वर्ग पर .delete() विधि को ओवरराइड करके सभी संबंधित रिकॉर्ड्स को स्वचालित रूप से हटा सकते हैं।

प्रदर्शन कारणों से, आप लगभग निश्चित रूप से केवल-केवल प्रश्नों का उपयोग करना चाहते हैं (आपको वास्तविक इकाइयों को लाने और डीकोड किए बिना इकाइयों की चाबियाँ हटाने की अनुमति मिलती हैं), और बैच हटाए जाते हैं। उदाहरण के लिए:

db.delete(Bottom.all(keys_only=True).filter("daddy =", top).fetch(1000)) 
+0

ब्याज से, प्रत्येक इकाई पर db.delete कॉल हटाएं() करता है? यह बेहद अनुकूल है, इसलिए मैं थोड़ा संदिग्ध हूं कि आप इन दो चालों को गठबंधन नहीं कर सकते हैं। हालांकि, key_only पर अच्छा बिंदु। –

+0

नहीं, db.delete() सीधे एक एकल आरपीसी से मेल खाता है जो समानांतर में सभी कुंजी को हटाया जाता है। Entity.delete() बस सिंटैक्टिक चीनी है जो db.delete (self) को कॉल करता है। –

+1

'db.delete (top.bottom_set) 'काम ठीक नहीं होगा? –

2

दरअसल यह व्यवहार GAE- विशिष्ट है। Django का ओआरएम .delete() पर "हटाए गए कैस्केड पर" अनुकरण करता है।

मुझे पता है कि यह आपके प्रश्न का उत्तर नहीं है, लेकिन शायद यह आपको गलत स्थानों को देखने में मदद कर सकता है। बात की

daddy.ancestry = "greatgranddaddy/granddaddy/daddy/" 
me.ancestry = daddy.ancestry + me.uniquename + "/" 

प्रकार:

1

अपने पदानुक्रम केवल गहरी स्तरों की एक छोटी संख्या है, तो आप एक क्षेत्र है कि एक फ़ाइल पथ की तरह दिखता है के साथ कुछ करने के लिए सक्षम हो सकता है। आपको अद्वितीय नामों की आवश्यकता है, कम से कम भाई बहनों के बीच अद्वितीय।

ऑब्जेक्ट आईडी में पथ पहले से ही करता है, लेकिन आईआईआरसी जो इकाई समूहों के साथ बाध्य है, जिसे आपको सलाह दी जाती है कि डेटा डोमेन में संबंध व्यक्त करने के लिए उपयोग न करें।

तो फिर तुम, प्रारंभिक सबस्ट्रिंग चाल का उपयोग कर granddaddy के वंशजों के सभी वापस जाने के लिए इस तरह एक प्रश्न का निर्माण कर सकते हैं:

query = Person.all() 
query.filter("ancestry >", gdaddy.ancestry + "\U0001") 
query.filter("ancestry <", gdaddy.ancestry + "\UFFFF") 

जाहिर है इस काम का नहीं है अगर आप एक 500 बाइट StringProperty में वंश फिट नहीं कर सकते ।

2

डेटा संरचना पर पुनर्विचार करें।

class Top(db.Model): pass 
class Middle(db.Model): pass 
class Bottom(db.Model): pass 

top = Top() 
middles = [Middle(parent=top) for i in range(0,10)] 
bottoms = [Bottom(parent=middle) for i in range(0,10) for middle in middles] 

फिर पूर्वज के लिए क्वेरी = शीर्ष सभी स्तरों से सभी रिकॉर्ड मिलेगा: रिश्ते रिकॉर्ड जीवन पर कभी नहीं बदलेगा, तो आप "पूर्वजों" GAE की सुविधा का उपयोग कर सकते हैं।इसलिए उन्हें हटाना आसान होगा।

descendants = list(db.Query().ancestor(top)) 
# should return [top] + middles + bottoms 
+0

सुंदर। सूची समझ का अच्छा उपयोग। मेरी पहली बार एक को दो लूप देख रहे हैं! ऐसा लगता है कि वे दूसरे ऑर्डर में होंगे, हालांकि बाहरी लूप पहले आ रहे हैं। –