জাজানো মডেলগুলিতে অন_ডিলেট কী করে?


348

আমি জ্যাঙ্গোর সাথে বেশ পরিচিত, তবে সম্প্রতি লক্ষ্য করেছি on_delete=models.CASCADEযে মডেলগুলির সাথে একটি বিকল্প রয়েছে , আমি এটির জন্য ডকুমেন্টেশন সন্ধান করেছি তবে এর চেয়ে বেশি কিছু পাই না:

জ্যাঙ্গো ১.৯-এ পরিবর্তিত হয়েছে:

on_deleteএখন দ্বিতীয় অবস্থানগত আর্গুমেন্ট হিসাবে ব্যবহার করা যেতে পারে (আগে এটি সাধারণত কেবল কীওয়ার্ড আর্গুমেন্ট হিসাবে পাস করা হত)। এটি জাজানো ২.০ এ প্রয়োজনীয় তর্ক হতে পারে।

ব্যবহারের একটি উদাহরণ ক্ষেত্রে

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

অন_ডিলেট কী করে? ( মডেলটি মোছা হয়ে গেলে করণীয়গুলি অনুমান করি )

কি করে models.CASCADE? ( ডকুমেন্টেশনে কোনও ইঙ্গিত )

অন্য কোন বিকল্প উপলব্ধ ( যদি আমার অনুমান সঠিক হয় )?

এই থাকার জন্য ডকুমেন্টেশন কোথায় থাকে?


এছাড়া একই ধরণের প্রস্তাব প্রশ্নের উত্তর হয় stackoverflow.com/questions/47914325/...
HelenM

1
এই অনুরূপ প্রশ্নের পাঠ্যটি এখন এই উত্তরের নীচে, নীচে তালিকাভুক্ত করা হয়েছে। এটি শুরু হয় "এফওয়াইআই, মডেলগুলির অন_ডিলিট প্যারামিটারটি যা মনে হচ্ছে তার থেকে পিছনে wards এটি মূল উত্তরগুলির চেয়ে অনেক বেশি বিশদ সরবরাহ করে।
হেলেন

উত্তর:


781

রেফারেন্সযুক্ত বস্তুটি মুছে ফেলা হলে এটি অবলম্বন করার আচরণ । এটি জাঙ্গোর সাথে নির্দিষ্ট নয়, এটি একটি এসকিউএল স্ট্যান্ডার্ড।

যখন এই জাতীয় ঘটনা ঘটে তখন 6 টি কার্যকর পদক্ষেপ নিতে হয়:

  • CASCADE: যখন রেফারেন্সযুক্ত বস্তুটি মুছে ফেলা হয়, তখন এর সাথে সম্পর্কিত রেফারেন্সযুক্ত অবজেক্টগুলিও মুছুন (আপনি উদাহরণস্বরূপ কোনও ব্লগ পোস্ট সরিয়ে ফেললে আপনি মন্তব্যগুলিও মুছতে পারেন)। এসকিউএল সমতুল্য: CASCADE
  • PROTECT: রেফারেন্সযুক্ত বস্তু মুছতে নিষেধ। এটিকে মোছার জন্য আপনাকে সেই সমস্ত বস্তু মুছতে হবে যা ম্যানুয়ালি এটি উল্লেখ করে। এসকিউএল সমতুল্য: RESTRICT
  • SET_NULL: NULL- তে রেফারেন্স সেট করুন (ক্ষেত্রটি nullaable হওয়া প্রয়োজন)। উদাহরণস্বরূপ, আপনি যখন কোনও ব্যবহারকারীকে মুছবেন, আপনি ব্লগ পোস্টগুলিতে তিনি যে মন্তব্যগুলি পোস্ট করেছেন সেগুলি রাখতে পারেন, তবে বলবেন এটি কোনও বেনাম (বা মোছা) ব্যবহারকারীর দ্বারা পোস্ট করা হয়েছিল। এসকিউএল সমতুল্য: SET NULL
  • SET_DEFAULT: ডিফল্ট মান সেট করুন। এসকিউএল সমতুল্য: SET DEFAULT
  • SET(...): একটি প্রদত্ত মান সেট করুন। এইটি এসকিউএল স্ট্যান্ডার্ডের অংশ নয় এবং পুরোপুরি জ্যাঙ্গো দ্বারা পরিচালিত।
  • DO_NOTHING: সম্ভবত এটি একটি খুব খারাপ ধারণা যেহেতু এটি আপনার ডাটাবেসে অখণ্ডতা সম্পর্কিত সমস্যা তৈরি করবে (এমন কোনও বস্তুর উল্লেখ করা যা বাস্তবে বিদ্যমান নেই)। এসকিউএল সমতুল্য: NO ACTION

সূত্র: জাজানো ডকুমেন্টেশন

উদাহরণস্বরূপ PostGreSQL এর ডকুমেন্টেশনও দেখুন ।

বেশিরভাগ ক্ষেত্রেই, CASCADEপ্রত্যাশিত আচরণ, তবে প্রতিটি ফরেনকির জন্য আপনার নিজেকে সর্বদা নিজেকে জিজ্ঞাসা করা উচিত যে এই পরিস্থিতিতে প্রত্যাশিত আচরণটি কী। PROTECTএবং SET_NULLপ্রায়শই দরকারী। CASCADEএটি যেখানে না হওয়া উচিত সেটিং , কেবলমাত্র একটি একক ব্যবহারকারীকে মুছে ফেলে আপনার সমস্ত ডাটাবেসকে ক্যাসকেডে সম্ভাব্যভাবে মুছতে পারে।


ক্যাসকেডের দিকটি স্পষ্ট করার জন্য অতিরিক্ত নোট

এটি লক্ষ্য করা মজার বিষয় যে CASCADEক্রিয়াটির দিকটি অনেক লোকের কাছে পরিষ্কার নয়। আসলে, এটা বিজ্ঞপ্তির মজার যে শুধুমাত্রCASCADE কর্ম স্পষ্ট নয়। আমি বুঝতে পারি ক্যাসকেড আচরণটি বিভ্রান্তিকর হতে পারে, তবে আপনাকে অবশ্যই মনে করতে হবে যে এটি অন্য কোনও ক্রিয়াকলাপের মতো একই দিক । সুতরাং, আপনি যদি মনে করেন যে CASCADEদিকটি আপনার কাছে পরিষ্কার নয় তবে এর অর্থ হ'ল on_deleteআচরণটি আপনার কাছে পরিষ্কার নয়।

আপনার ডাটাবেসে, একটি বিদেশী কী মূলত একটি পূর্ণসংখ্যা ক্ষেত্র দ্বারা প্রতিনিধিত্ব করা হয় যা মানটি বিদেশী অবজেক্টের প্রাথমিক কী। আসুন বলতে আপনি একটি এন্ট্রি থাকে comment_A , যা একটি এন্ট্রি করার একটি বিদেশী কী হয়েছে article_B । আপনি এন্ট্রি মুছে ফেলেন, তাহলে comment_A , সবকিছু ঠিক হল, article_B ছাড়া বাঁচতে ব্যবহৃত comment_A এবং বিরক্ত না হলে এটি মুছে ফেলা হচ্ছে। যাইহোক, যদি আপনি মুছে ফেলতে article_B তারপর, comment_A প্যানিক সৃষ্টি! এটি আর্টিকেল_বি ছাড়া কখনও বাঁচেনি এবং এটির প্রয়োজন নেই, এটি এর বৈশিষ্ট্যের অংশ ( article=article_Bতবে * নিবন্ধ_বি ** কী ???)। on_deleteএই সততা ত্রুটিটি কীভাবে সমাধান করা যায় তা নির্ধারণ করতে এখানে পদক্ষেপ রয়েছে This, হয় বলে:

  • "না! প্লিজ! না! আমি তোমাকে ছাড়া বাঁচতে পারি না!" (যা PROTECTএসকিউএল ভাষায় বলা হয়)
  • "ঠিক আছে, আমি যদি আপনার না হয় তবে আমি কারওই নই" (যা বলা হয় SET_NULL)
  • "গুড বাই ওয়ার্ল্ড, আমি আর্টিকেল_বি ছাড়া বাঁচতে পারি না" এবং আত্মহত্যা করতে পারি (এটিই CASCADEআচরণ)।
  • "এটি ঠিক আছে, আমি অতিরিক্ত প্রেমিক পেয়েছি, আমি এখন থেকে নিবন্ধ_ সি রেফারেন্স করব" ( SET_DEFAULT, বা এমনকি SET(...))।
  • "আমি বাস্তবতার মুখোমুখি হতে পারি না, আমি যদি কেবল এটাই রেখে যাই তবে আমি আপনার নামটি ডাকব!" ( DO_NOTHING)

আমি আশা করি এটি ক্যাসকেডের দিকনির্দেশকে আরও পরিষ্কার করে দেয়। :)


19
একটি নির্বোধ প্রশ্ন, কিন্তু ক্যাসকেড সবসময় এক দিকনির্দেশক সঠিক হওয়া উচিত? অর্থ্যাৎ ব্লগপোস্ট মুছে ফেলার Comment জন্য যদি কোনও বিদেশী কী থাকে BlogPostতবে মন্তব্য মুছে ফেলা উচিত, তবে মন্তব্য মুছে ফেলার সাথে আরডিএমএস নির্বিশেষে ব্লগপোস্ট মুছে ফেলা উচিত নয়?
অ্যান্টনি ম্যানিং-ফ্র্যাঙ্কলিন

20
নিবন্ধন করুন মুছে ফেলা কেবল তখনই ট্রিগার করা হয় যখন কোনও রেফারেন্স "ভাঙ্গা" হয়। আপনি যখন কোনও মন্তব্য মুছবেন তখন কেস নয় as
এন্টোইন পিনসার্ড

6
প্রশ্নটি নিরীহ নয়; আমারও সেই ব্যাখ্যা দরকার। সুতরাং আমরা এখানে ধরে নিই যে সম্পর্কটি ইউনি-পার্শ্বযুক্ত, সম্পর্কের মালিক Comment, যার টেবিলে এফকে ক্ষেত্র রয়েছে, যখন আমরা বাস্তব জীবনের মডেল সম্পর্কে কথা বলি তবে BlogPost"মালিকানাধীন" Comment। ভাল.
ওয়েস্টার্নগুন

3
গুরুত্বপূর্ণ বিষয়টি লক্ষ্য করার বিষয়টি হ'ল জ্যাঙ্গোতে অন-ডিলিট সেট করা ডেটাবেজে নিজেই একটি অপসারণ শৃঙ্খলা তৈরি করে না। নির্দিষ্ট আচরণ (যেমন CASCADE) কেবলমাত্র জ্যাঙ্গোর মাধ্যমে সম্পাদিত মুছে ফেলাগুলিকে প্রভাবিত করবে, এবং সরাসরি ডাটাবেসে কাঁচা মুছে ফেলবে না।
জোমজর

2
দুর্দান্ত ব্যাখ্যা। আমার কাছ থেকে একটি উক্তি পেতে!
হোমানকুলাস রেটিকুলি

42

on_deleteপদ্ধতি জ্যাঙ্গো কি মডেল দৃষ্টান্ত যে মডেল উদাহরণস্বরূপ আপনি মুছে ফেলতে উপর নির্ভর করে না বলুন করতে ব্যবহৃত হয়। (যেমন একটি ForeignKeyসম্পর্ক) on_delete=models.CASCADEজ্যাঙ্গো বলে মুছে ফেলা প্রভাব অর্থাত পাশাপাশি নির্ভরশীল মডেলের মোছার অবিরত নির্ঝর।

এখানে আরও দৃ concrete় উদাহরণ। ধরুন আপনার কাছে এমন একটি Authorমডেল রয়েছে যা ForeignKeyএকটি Bookমডেল a এখন, আপনি যদি Authorমডেলের কোনও উদাহরণ মুছে ফেলেন, জ্যাঙ্গো Bookমডেলটির সেই উদাহরণগুলির উপর নির্ভর করে এমন মডেলগুলির উদাহরণগুলির সাথে কী করবেন তা জানতেন না Authoron_deleteপদ্ধতি জ্যাঙ্গো কি যে ক্ষেত্রে কি বলে। সেটিং on_delete=models.CASCADEজাঙ্গোকে মুছে ফেলার প্রভাবটি ক্যাসকেড করার নির্দেশ দেয় অর্থাৎ আপনি মোছা মডেলের উদাহরণগুলির Bookউপর নির্ভর করে সমস্ত মডেল দৃষ্টান্ত মুছবেন Author

দ্রষ্টব্য: on_deleteজাজানো 2.0 তে একটি প্রয়োজনীয় যুক্তি হয়ে উঠবে। পুরানো সংস্করণে এটি ডিফল্ট হয় CASCADE

এখানে পুরো অফিসিয়াল ডকুমেন্টেশন।


37

এফওয়াইআই, on_deleteমডেলগুলির পরামিতিগুলি যা মনে হচ্ছে তার থেকে পিছনে। আপনি on_deleteআপনার রেকর্ডের দিকে ইঙ্গিত করছে এমন এফকে প্রবেশিকাটি মুছে ফেলা হলে জাঙ্গোকে কী করতে হবে তা জানার জন্য আপনি একটি মডেলটিতে একটি বিদেশী কী (এফকে) রেখেছিলেন । অপশন আমাদের দোকান ব্যবহার করেছেন সবচেয়ে হয় PROTECT, CASCADEএবং SET_NULL। আমি যে প্রাথমিক নিয়মগুলি বের করেছি তা এখানে:

  1. PROTECTযখন আপনার এফকে কোনও লুক-টেবিলের দিকে ইঙ্গিত করছে তখন যা সত্যিই পরিবর্তন করা উচিত নয় এবং এটি অবশ্যই আপনার টেবিলটি পরিবর্তিত হওয়ার কারণ নয় Use যদি কেউ সেই লুক-আপ টেবিলটিতে কোনও এন্ট্রি মুছে ফেলার চেষ্টা PROTECTকরে তবে এটি কোনও রেকর্ডের সাথে আবদ্ধ থাকলে তা মুছতে বাধা দেয়। এটি ঝ্যাঙ্গোকে কেবল আপনার রেকর্ড মুছতে বাধা দেয় কারণ এটি কোনও চেহারা-সারণীতে একটি প্রবেশিকা মুছে ফেলে। এই শেষ অংশটি সমালোচনামূলক। যদি কেউ আমার লিঙ্গ টেবিল থেকে "মহিলা" লিঙ্গটি মুছে ফেলেন তবে আমি অবশ্যই চাইব না যে আমার ব্যাক্তি সারণীতে আমার যে লিঙ্গটি ছিল তাদের এবং তাত্ক্ষণিকভাবে মুছে ফেলা উচিত।
  2. CASCADEযখন আপনার এফকে "প্যারেন্ট" রেকর্ডটির দিকে ইঙ্গিত করছে তখন ব্যবহার করুন । সুতরাং, একটি ব্যক্তি অনেক PersonEthnicity এন্ট্রি থাকতে পারে (তিনি / সে আমেরিকান ভারতীয়, ব্ল্যাক এবং হোয়াইট হতে পারে), এবং যে ব্যক্তি হয় মুছে ফেলা, আমি সত্যিই চাই কাঙ্ক্ষিত "শিশু" PersonEthnicity এন্ট্রি মুছে ফেলা হবে। তারা ব্যক্তি ব্যতীত অপ্রাসঙ্গিক।
  3. ব্যবহার করুন 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কিছুই রাখার মতো না রাখা একই জিনিস।


12

পূর্বে উল্লিখিত হিসাবে, ক্যাসকেড বিদেশী কী রয়েছে এমন রেকর্ড মুছে ফেলবে এবং মুছে ফেলা অন্য কোনও অবজেক্টের উল্লেখ করবে। সুতরাং উদাহরণস্বরূপ যদি আপনার কাছে কোনও রিয়েল এস্টেট ওয়েবসাইট থাকে এবং কোনও সম্পত্তি যা কোনও শহরের উল্লেখ করে ferences

class City(models.Model):
    # define model fields for a city

class Property(models.Model):
    city = models.ForeignKey(City, on_delete = models.CASCADE)
    # define model fields for a property

এবং এখন যখন শহরটি ডাটাবেস থেকে মুছে ফেলা হবে, তখন সম্পর্কিত সমস্ত সম্পত্তি (যেমন city শহরে অবস্থিত রিয়েল এস্টেট )ও ডাটাবেস থেকে মুছে ফেলা হবে

এখন আমি অন্যান্য বিকল্পগুলির যোগ্যতাও উল্লেখ করতে চাই, যেমন SET_NULL বা SET_DEFAULT বা এমনকি ডিও_ওথিং। মূলত, প্রশাসনের দৃষ্টিকোণ থেকে, আপনি সেই রেকর্ডগুলি "মুছতে" চান। তবে আপনি চান না যে সেগুলি অদৃশ্য হয়ে যাবে। অনেক কারণে. কেউ এটিকে দুর্ঘটনাক্রমে, বা নিরীক্ষণ এবং পর্যবেক্ষণের জন্য মুছে ফেলতে পারে। এবং সরল রিপোর্টিং। সুতরাং এটি কোনও শহর থেকে সম্পত্তি "সংযোগ বিচ্ছিন্ন" করার উপায় হতে পারে। আবার এটি আপনার অ্যাপ্লিকেশন কীভাবে রচিত তা নির্ভর করবে will

উদাহরণস্বরূপ, কিছু অ্যাপ্লিকেশনগুলির ক্ষেত্রে একটি ক্ষেত্র "মুছে ফেলা" থাকে যা 0 বা 1 হয় And এবং তাদের সমস্ত অনুসন্ধান এবং তালিকার ভিউ ইত্যাদি reports প্রতিবেদনগুলিতে প্রদর্শিত হতে পারে বা যে কোনও জায়গায় ব্যবহারকারীর সামনে প্রান্ত থেকে এটি অ্যাক্সেস করতে পারে, যা আছে তা বাদ দিন deleted == 1। তবে, আপনি যদি মুছে ফেলা হয়েছে এমন রেকর্ডগুলির একটি তালিকা নীচে টেনে নেওয়ার জন্য যদি একটি কাস্টম রিপোর্ট বা একটি কাস্টম ক্যোয়ারী তৈরি করেন তবে এটি সর্বশেষে কখন সংশোধিত হয়েছিল (অন্য ক্ষেত্র) এবং কারা (যিনি এটি মুছে ফেলেছেন এবং কখন) দেখুন .. এটি কার্যনির্বাহী দৃষ্টিকোণ থেকে খুব সুবিধাজনক।

এবং ভুলে যাবেন না যে আপনি দুর্ঘটনাজনিত মোছাগুলি deleted = 0সেই রেকর্ডগুলির মতো সহজ সরানো করতে পারেন ।

আমার বক্তব্যটি হ'ল যদি কোনও কার্যকারিতা থাকে তবে এর পিছনে সর্বদা কারণ থাকে। সবসময় একটি ভাল কারণ না। তবে একটি কারণ। এবং প্রায়শই একটি ভাল।


3
এটি সহায়ক ছিল কারণ এটি স্পষ্ট করে জানিয়েছে যে ক্যাসকেড কোন দিকে ঘটে। আপনি যদি এসকিউএল ক্যাসকেডের সাথে অপরিচিত হন তবে গৃহীত উত্তরটি পরিষ্কার নয়।
কোডসেব্লব্লার

আপনাকে ধন্যবাদ, অনেক প্রশংসা!
জর্জ মোগিলিভস্কি

2
আমি এই উত্তরটিকে সমর্থন করেছি কারণ এটি সম্পর্কের মডেলটির দিক সম্পর্কে আমার সন্দেহের প্রতিক্রিয়া জানায়
এডেপ

6

আপনার প্রশ্নের উত্তর এখানে রয়েছে যা বলে: আমরা অন_ডিলিট কেন ব্যবহার করি?

যখন ফরেনকি-র দ্বারা রেফারেন্সযুক্ত কোনও বস্তু মুছে ফেলা হয়, তখন জাঙ্গো ডিফল্টরূপে মুছে ফেলুন ক্যাসকেডে এসকিউএল সীমাবদ্ধতার আচরণ অনুকরণ করে এবং বিদেশীকি যুক্ত বস্তুটি মুছে দেয়। On_delete আর্গুমেন্ট নির্দিষ্ট করে এই আচরণটি ওভাররাইড করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনার কাছে একটি বাতিলযোগ্য ফরেনকে থাকে এবং আপনি উল্লেখ করতে পারেন যে রেফারেন্সযুক্ত বস্তুটি মুছে ফেলা হবে তখন:

user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL)

On_delete এর সম্ভাব্য মানগুলি django.db.models এ পাওয়া যায়:

ক্যাসকেড : ক্যাসকেড মুছে ফেলা; ডিফল্ট.

সুরক্ষা: প্রজাতন্ত্রতীয়তা, django.db.IntegrityError এর একটি সাবক্লাস উত্থাপন করে রেফারেন্স করা অবজেক্টটিকে মুছে ফেলার প্রতিরোধ করুন।

SET_NULL: ফরেনকে নাল সেট করুন; নাল সত্য হলে এটিই সম্ভব।

SET_DEFAULT: ফরেনকেকে তার ডিফল্ট মানতে সেট করুন; ফরেনকির জন্য একটি ডিফল্ট সেট করা আবশ্যক।


সরল শব্দগুলি আমার পক্ষে এটি পরিষ্কার করে দেয় কারণ আমি স্ক্যাল এবং জ্যাঙ্গোর সাথেও পরিপক্ক নই। ধন্যবাদ.
wm.p1us

3

ধরা যাক আপনার দুটি মডেল রয়েছে যার একটির নাম ব্যক্তি এবং অপরটির নাম কোম্পানির

সংজ্ঞা অনুসারে, একজন ব্যক্তি একাধিক সংস্থা তৈরি করতে পারে।

কোনও সংস্থার বিবেচনা করে একজন এবং কেবল একজন ব্যক্তি থাকতে পারে, আমরা চাই যে কোনও ব্যক্তি মুছে ফেলা হলে সেই ব্যক্তির সাথে সম্পর্কিত সমস্ত সংস্থাও মুছে ফেলা হয়।

সুতরাং, আমরা এটির মতো একটি ব্যক্তি মডেল তৈরি করে শুরু করি

class Person(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=20)

    def __str__(self):
        return self.id+self.name

তারপরে, সংস্থাগুলি মডেলটি এটির মতো দেখতে পারে

class Companies(models.Model):
    title = models.CharField(max_length=20)
    description=models.CharField(max_length=10)
    person= models.ForeignKey(Person,related_name='persons',on_delete=models.CASCADE)

on_delete=models.CASCADEমডেল সংস্থাগুলিতে ব্যবহারের বিষয়টি লক্ষ্য করুন । এটি হ'ল সমস্ত সংস্থা মুছতে হবে যখন মালিকানাধীন ব্যক্তিটি (শ্রেণীর ব্যক্তির উদাহরণ) মুছে ফেলা হবে।


1

ইতিমধ্যে বিদ্যমান ক্যাসকেডে (যেমন একটি জলপ্রপাত) এফকে যুক্ত করার চিন্তা করে আপনার "ক্যাসকেড" এর কার্যকারিতা সম্পর্কে আপনার মানসিক মডেলটিকে পুনরায় আলোকিত করুন। এই জলপ্রপাতের উত্স একটি প্রাথমিক কী। নিচে প্রবাহ মুছে ফেলা হয়।

সুতরাং আপনি যদি কোনও এফকে অন-ডিলিটকে "ক্যাসকেড" হিসাবে সংজ্ঞায়িত করেন তবে আপনি এই এফকে রেকর্ডটি পিকে থেকে উত্পন্ন মুছে ফেলার একটি ক্যাসকেডে যুক্ত করছেন। এফকে রেকর্ডটি এই ক্যাসকেডে অংশ নিতে পারে বা না ("SET_NULL")। আসলে, এফকে সহ একটি রেকর্ড এমনকি মুছে ফেলার প্রবাহকে আটকাতে পারে! "সুরক্ষা" দিয়ে একটি বাঁধ তৈরি করুন।


0

ক্যাসকেড ব্যবহার করার অর্থ আসলে জ্যাঙ্গোকে রেফারেন্সকৃত রেকর্ড মুছতে বলা। নীচের পোল অ্যাপের উদাহরণে: যখন একটি 'প্রশ্ন' মুছে ফেলা হয় তখন এটি এই প্রশ্নটির পছন্দগুলিও মুছে ফেলবে।

যেমন প্রশ্ন: আপনি আমাদের সম্পর্কে কীভাবে শুনলেন? (পছন্দসমূহ: 1. বন্ধুরা 2. টিভি বিজ্ঞাপন 3. সার্চ ইঞ্জিন 4. ইমেল প্রচার)

আপনি যখন এই প্রশ্নটি মুছবেন, এটি সারণী থেকে এই চারটি পছন্দও মুছে ফেলবে। এটি কোন দিকে প্রবাহিত হয়েছে তা নোট করুন। আপনাকে অন_ডিলিট = মডেলগুলি লাগাতে হবে না Question প্রশ্ন মডেলটিতে ক্যাসকেড এটিকে পছন্দ হিসাবে রাখুন।

from django.db import models



class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.dateTimeField('date_published')

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_legth=200)
    votes = models.IntegerField(default=0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.