मैं स्वीकार किए गए उत्तर के साथ एक जोड़े में मिल गया है। यहाँ मेरा समाधान है।
import copy
def clone(instance):
cloned = copy.copy(instance) # don't alter original instance
cloned.pk = None
try:
delattr(cloned, '_prefetched_objects_cache')
except AttributeError:
pass
return cloned
नोट: यह उन समाधानों का उपयोग करता है जो Django डॉक्स में आधिकारिक तौर पर स्वीकृत नहीं हैं, और वे भविष्य के संस्करणों में काम करना बंद कर सकते हैं। मैंने 1.9.13 में इसका परीक्षण किया।
पहला सुधार यह है कि यह आपको मूल उदाहरण का उपयोग करके, जारी रखने की अनुमति देता है copy.copy
। यहां तक कि अगर आप उदाहरण का पुन: उपयोग करने का इरादा नहीं रखते हैं, तो यह चरण ऐसा करने के लिए सुरक्षित हो सकता है यदि आप जिस क्लोन का उपयोग कर रहे हैं वह फ़ंक्शन के तर्क के रूप में पारित किया गया था। यदि नहीं, तो फ़ंक्शन के वापस आने पर कॉलर को अप्रत्याशित रूप से एक अलग उदाहरण होगा।
copy.copy
वांछित तरीके से एक Django मॉडल उदाहरण की उथली प्रतिलिपि का उत्पादन करने के लिए लगता है। यह उन चीजों में से एक है जिन्हें मैंने दस्तावेज नहीं पाया था, लेकिन यह अचार और अनप्लिकिंग द्वारा काम करता है, इसलिए यह संभवतः अच्छी तरह से समर्थित है।
दूसरे, स्वीकृत उत्तर नए उदाहरण से जुड़े किसी भी पूर्वनिर्धारित परिणाम को छोड़ देगा। जब तक आप स्पष्ट रूप से कई रिश्तों की नकल नहीं करते हैं, तब तक उन परिणामों को नए उदाहरण के साथ संबद्ध नहीं किया जाना चाहिए। यदि आप पहले से तय किए गए रिश्तों को आगे बढ़ाते हैं, तो आपको ऐसे परिणाम मिलेंगे जो डेटाबेस से मेल नहीं खाते हैं। जब आप एक प्रीफ़ेट जोड़ते हैं तो वर्किंग कोड को तोड़ना एक बुरा आश्चर्य हो सकता है।
हटाना _prefetched_objects_cache
सभी प्रीफ़ेट को दूर करने का एक त्वरित और गंदा तरीका है। इसके बाद से कई एक्सेस काम करते हैं जैसे कि कोई प्रीफ़ैच नहीं था। एक अनड्रेस्केटेड प्रॉपर्टी का उपयोग करना, जो अंडरस्कोर से शुरू होता है, संभवतः संगतता समस्या के लिए पूछ रहा है, लेकिन यह अभी के लिए काम करता है।