এফওয়াইআই, on_deleteমডেলগুলির পরামিতিগুলি যা মনে হচ্ছে তার থেকে পিছনে। আপনি on_deleteআপনার রেকর্ডের দিকে ইঙ্গিত করছে এমন এফকে প্রবেশিকাটি মুছে ফেলা হলে জাঙ্গোকে কী করতে হবে তা জানার জন্য আপনি একটি মডেলটিতে একটি বিদেশী কী (এফকে) রেখেছিলেন । অপশন আমাদের দোকান ব্যবহার করেছেন সবচেয়ে হয় PROTECT, CASCADEএবং SET_NULL। আমি যে প্রাথমিক নিয়মগুলি বের করেছি তা এখানে:
PROTECTযখন আপনার এফকে কোনও লুক-টেবিলের দিকে ইঙ্গিত করছে তখন যা সত্যিই পরিবর্তন করা উচিত নয় এবং এটি অবশ্যই আপনার টেবিলটি পরিবর্তিত হওয়ার কারণ নয় Use যদি কেউ সেই লুক-আপ টেবিলটিতে কোনও এন্ট্রি মুছে ফেলার চেষ্টা PROTECTকরে তবে এটি কোনও রেকর্ডের সাথে আবদ্ধ থাকলে তা মুছতে বাধা দেয়। এটি ঝ্যাঙ্গোকে কেবল আপনার রেকর্ড মুছতে বাধা দেয় কারণ এটি কোনও চেহারা-সারণীতে একটি প্রবেশিকা মুছে ফেলে। এই শেষ অংশটি সমালোচনামূলক। যদি কেউ আমার লিঙ্গ টেবিল থেকে "মহিলা" লিঙ্গটি মুছে ফেলেন তবে আমি অবশ্যই চাইব না যে আমার ব্যাক্তি সারণীতে আমার যে লিঙ্গটি ছিল তাদের এবং তাত্ক্ষণিকভাবে মুছে ফেলা উচিত।
CASCADEযখন আপনার এফকে "প্যারেন্ট" রেকর্ডটির দিকে ইঙ্গিত করছে তখন ব্যবহার করুন । সুতরাং, একটি ব্যক্তি অনেক PersonEthnicity এন্ট্রি থাকতে পারে (তিনি / সে আমেরিকান ভারতীয়, ব্ল্যাক এবং হোয়াইট হতে পারে), এবং যে ব্যক্তি হয় মুছে ফেলা, আমি সত্যিই চাই কাঙ্ক্ষিত "শিশু" PersonEthnicity এন্ট্রি মুছে ফেলা হবে। তারা ব্যক্তি ব্যতীত অপ্রাসঙ্গিক।
- ব্যবহার করুন
SET_NULLযখন আপনি কি মানুষ দেখে-আপ টেবিলের উপর একটি এন্ট্রি মুছে ফেলতে অনুমতি দেওয়া করতে চান, কিন্তু আপনি এখনও আপনার রেকর্ড সংরক্ষণ করতে চান। উদাহরণস্বরূপ, যদি কোনও ব্যক্তির হাইস্কুল থাকতে পারে তবে উচ্চ বিদ্যালয়টি আমার চেহারা-সারণীতে চলে গেলে আমার পক্ষে আসলেই কিছু আসে যায় না, আমি বলব on_delete=SET_NULL। এটি আমার ব্যক্তির রেকর্ডটি বাইরে রাখবে; এটি কেবলমাত্র আমার ব্যক্তির উপর হাই-স্কুল এফকে স্থির করবে। স্পষ্টতই, আপনাকে null=Trueসেই এফকে অনুমতি দিতে হবে ।
তিনটি কাজ করে এমন একটি মডেলের উদাহরণ এখানে দেওয়া হয়েছে:
class PurchPurchaseAccount(models.Model):
id = models.AutoField(primary_key=True)
purchase = models.ForeignKey(PurchPurchase, null=True, db_column='purchase', blank=True, on_delete=models.CASCADE) # If "parent" rec gone, delete "child" rec!!!
paid_from_acct = models.ForeignKey(PurchPaidFromAcct, null=True, db_column='paid_from_acct', blank=True, on_delete=models.PROTECT) # Disallow lookup deletion & do not delete this rec.
_updated = models.DateTimeField()
_updatedby = models.ForeignKey(Person, null=True, db_column='_updatedby', blank=True, related_name='acctupdated_by', on_delete=models.SET_NULL) # Person records shouldn't be deleted, but if they are, preserve this PurchPurchaseAccount entry, and just set this person to null.
def __unicode__(self):
return str(self.paid_from_acct.display)
class Meta:
db_table = u'purch_purchase_account'
একটি শেষ বারান্দা হিসাবে, আপনি কি জানেন যে আপনি নির্দিষ্ট না করেon_delete (বা না), ডিফল্ট আচরণ CASCADE? এর অর্থ হ'ল যদি কেউ আপনার জেন্ডার টেবিলে লিঙ্গ এন্ট্রি মুছে ফেলে তবে সেই লিঙ্গ সহ যে কোনও ব্যক্তি রেকর্ডও মুছে ফেলা হয়েছে!
আমি বলব, "যদি সন্দেহ হয় তবে সেট করুন on_delete=models.PROTECT।" তারপরে আপনার আবেদন পরীক্ষা করুন test আপনার কোনও ডেটা বিপন্ন না করে কোন এফকে অন্যান্য মানগুলি লেবেল করা উচিত তা আপনি দ্রুতই সনাক্ত করতে পারবেন।
এছাড়াও, এটি লক্ষণীয় যে আপনার on_delete=CASCADEবাস্তবে কোনওটিই যুক্ত হয় না, যদি এটি আপনি বেছে নিচ্ছেন এমন আচরণ হয়। আমার ধারণা এটি এর কারণ এটি ডিফল্ট, সুতরাং on_delete=CASCADEকিছুই রাখার মতো না রাখা একই জিনিস।