আমি গৃহীত উত্তর দিয়ে কয়েকটা গোটাচায় ছড়িয়েছি। এখানে আমার সমাধান।
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
দ্রষ্টব্য: এটি সমাধানগুলি ব্যবহার করে যা জ্যাঙ্গো ডক্সে আনুষ্ঠানিকভাবে অনুমোদিত নয় এবং তারা ভবিষ্যতের সংস্করণগুলিতে কাজ করা বন্ধ করতে পারে। আমি এটি পরীক্ষা করেছি 1.9.13 এ।
প্রথম উন্নতি হ'ল এটি আপনাকে ব্যবহার করে মূল দৃষ্টান্তটি ব্যবহার চালিয়ে যাওয়ার অনুমতি দেয় copy.copy। এমনকি আপনি যদি উদাহরণটি পুনঃব্যবহারের উদ্দেশ্যে নাও করেন তবে আপনি যে ক্লোনিং করছেন সেটি কোনও ফাংশনের আর্গুমেন্ট হিসাবে পাস করা হলে এই পদক্ষেপটি করা আরও নিরাপদ। যদি তা না হয় তবে ফাংশনটি ফিরে আসার সাথে কলারের অপ্রত্যাশিতভাবে আলাদা ঘটনা ঘটবে।
copy.copyপছন্দসই উপায়ে জ্যাঙ্গো মডেলের উদাহরণের অগভীর অনুলিপি তৈরি করেছে বলে মনে হচ্ছে। এটি এমন একটি জিনিস যা আমি নথিভুক্ত পাইনি, তবে এটি পিকিং এবং আন-পিক্লিংয়ের মাধ্যমে কাজ করে, সুতরাং এটি সম্ভবত ভাল-সমর্থিত।
দ্বিতীয়ত, অনুমোদিত উত্তরটি নতুন উদাহরণের সাথে সংযুক্ত কোনও পূর্বনির্ধারিত ফলাফল ছেড়ে দেবে। এই ফলাফলগুলি নতুন উদাহরণের সাথে যুক্ত করা উচিত নয়, যদি না আপনি স্পষ্টভাবে বহু সম্পর্কের সাথে অনুলিপি করেন। আপনি যদি পূর্বনির্ধারিত সম্পর্কগুলিকে অতিক্রম করেন তবে আপনি ফলাফল পাবেন যা ডাটাবেসের সাথে মেলে না। আপনি একটি উপস্থাপনা যুক্ত করার সময় ওয়ার্কিং কোড ভঙ্গ করা একটি বাজে আশ্চর্য হতে পারে।
মুছে ফেলা _prefetched_objects_cacheসমস্ত প্রিফেসকে সরিয়ে ফেলার একটি দ্রুত এবং নোংরা উপায়। পরবর্তীকালে অনেকগুলি অ্যাক্সেসগুলি এমনভাবে কাজ করে যেন কোনও প্রিফেচ ছিল না। আন্ডারস্কোর দিয়ে শুরু হওয়া একটি অননুমোদিত সম্পত্তি ব্যবহার করা সম্ভবত সামঞ্জস্যের সমস্যার জন্য জিজ্ঞাসা করছে, তবে এটি আপাতত কাজ করে।