মন্তব্যে উল্লিখিত হিসাবে, "এই সেটআপের সাথে এটি উভয়ের প্রয়োজন" এর কারণটি হ'ল blank=True
আপনি আপনার এফকে ক্ষেত্রে যোগ করতে ভুলে গেছেন , সুতরাং আপনার ModelForm
(কাস্টম একটি বা অ্যাডমিন দ্বারা উত্পাদিত ডিফল্ট) ফর্ম ক্ষেত্রটি প্রয়োজনীয় করে তুলবে । ডিবি স্কিমা স্তরে, আপনি উভয়ই পূরণ করতে পারেন, উভয়ই এফকে বা যেকোন একটিও নয়, কারণ আপনি এই ডিবি ক্ষেত্রগুলিকে নলাবদ্ধ করে দিয়েছেন ( null=True
যুক্তি দিয়ে)।
এছাড়াও, (আমার অন্যান্য মন্তব্য সিএফ), আপনি যাচাই করতে চাইতে পারেন যে আপনি সত্যই এফকে অনন্য হতে চান। এই প্রযুক্তিগতভাবে আপনার একটিকে অনেক সম্পর্কের সাথে একের সম্পর্কের মধ্যে রূপান্তরিত করে - আপনি কেবলমাত্র একটি গ্রুপআইডিডি বা সাইটআইডির জন্য কেবল একটি একক 'পরিদর্শন' রেকর্ডের অনুমতি পেয়েছেন (একটি গ্রুপআইড বা সাইটআইডির জন্য আপনার দুটি বা আরও 'পরিদর্শন' থাকতে পারে না) । যদি এটি সত্যিই আপনি চান তবে আপনি পরিবর্তে একটি স্পষ্ট ওয়ানটোওফিল্ড ব্যবহার করতে চাইতে পারেন (ডিবি স্কিমাটি একই হবে তবে মডেলটি আরও স্পষ্ট এবং সম্পর্কিত বর্ণনাকারী এই ব্যবহারের ক্ষেত্রে আরও বেশি ব্যবহারযোগ্য হবে)।
পার্শ্ব নোট হিসাবে: একটি জ্যাঙ্গো মডেলে, একটি বিদেশী ক্ষেত্রটি কোনও কাঁচা আইডি হিসাবে নয়, সম্পর্কিত মডেল উদাহরণ হিসাবে প্রমাণিত করে। IOW, এটি দেওয়া:
class Foo(models.Model):
name = models.TextField()
class Bar(models.Model):
foo = models.ForeignKey(Foo)
foo = Foo.objects.create(name="foo")
bar = Bar.objects.create(foo=foo)
তারপরে bar.foo
সংকল্প হবে foo
, না foo.id
। সুতরাং আপনি অবশ্যই আপনার InspectionID
এবং SiteID
ক্ষেত্রগুলির যথাযথ inspection
এবং নামকরণ করতে চান site
। বিটিডাব্লু, পাইথনে, নামকরণ সম্মেলনটি শ্রেণীর নাম এবং সিউডো-কনস্ট্যান্ট বাদে অন্য যে কোনও কিছুর জন্য 'অল_ল্লোয়ার_উইথ_ফন্ডসরস'।
এখন আপনার মূল প্রশ্নের জন্য: ডাটাবেস স্তরে "একটি বা অন্য" বাধা প্রয়োগের কোনও নির্দিষ্ট স্ট্যান্ডার্ড এসকিউএল উপায় নেই, তাই এটি সাধারণত একটি চেক বাধা ব্যবহার করে সম্পন্ন করা হয়, যা মডেলটির মেটা "সীমাবদ্ধতা" দিয়ে জাজানো মডেলে করা হয় বিকল্প ।
এটি বলা হচ্ছে, ডিবি স্তরে কীভাবে সীমাবদ্ধতাগুলি আসলে সমর্থন করা হয় এবং প্রয়োগ করা হয় তা আপনার ডিবি বিক্রেতার উপর নির্ভর করে (মাইএসকিউএল <8.0.16 কেবল উদাহরণস্বরূপ এগুলি উপেক্ষা করুন ), এবং আপনার যে ধরণের প্রতিবন্ধকতার প্রয়োজন হবে তা ফর্মটিতে প্রয়োগ করা হবে না বা মডেল স্তরের বৈধতা , কেবলমাত্র মডেলটি সংরক্ষণ করার চেষ্টা করার সময়, আপনি মডেল স্তরে (সর্বাধিক) বা ফর্ম স্তরের বৈধতা উভয় ক্ষেত্রে (রেস।) মডেল বা ফর্মের পদ্ধতিতে বৈধতা যুক্ত করতে চান ।clean()
একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে:
প্রথমে ডাবল-চেক করুন যে আপনি সত্যিই এই unique=True
সীমাবদ্ধতা চান এবং যদি হ্যাঁ হয় তবে আপনার এফকে ক্ষেত্রটি ওয়ানটোঅনফিল্ডের সাথে প্রতিস্থাপন করুন।
একটি যোগ blank=True
আপনার এফ কে (অথবা OneToOne) উভয় ARG ক্ষেত্র
- আপনার মডেলের মেটাতে যথাযথ চেক সীমাবদ্ধতা যুক্ত করুন - ডকটি সাফল্যযুক্ত তবে এখনও আপনি যদি ওআরএম এর সাথে জটিল প্রশ্নগুলি করতে জানেন তবে (এবং আপনি যদি সময় শিখেন না ;-))
clean()
আপনার মডেলটিতে এমন একটি পদ্ধতি যুক্ত করুন যা আপনার এক বা অন্য ক্ষেত্রটি পরীক্ষা করে এবং অন্য কোনও বৈধতা ত্রুটি উত্থাপন করে
এবং আপনার ঠিক হওয়া উচিত, আপনার RDBMS অবশ্যই চেক সীমাবদ্ধতার সম্মান করে।
কেবলমাত্র নোট করুন, এই নকশার সাহায্যে আপনার Inspection
মডেলটি একেবারে অকেজো (এখনও ব্যয়বহুল!) ইন্ডিয়ারেশন - আপনি সরাসরি এফকে (এবং সীমাবদ্ধতা, বৈধকরণ ইত্যাদি) সরাসরি স্থানান্তরিত করে স্বল্প মূল্যে একই বৈশিষ্ট্যগুলি পেতে পারেন InspectionReport
।
এখন আর একটি সমাধান হতে পারে - পরিদর্শন মডেলটি রাখুন, তবে সম্পর্কের অন্য প্রান্তে (সাইট এবং গোষ্ঠীতে) এফকে ওয়ানটোনফিল্ড হিসাবে রাখুন:
class Inspection(models.Model):
id = models.AutoField(primary_key=True) # a pk is always unique !
class InspectionReport(models.Model):
# you actually don't need to manually specify a PK field,
# Django will provide one for you if you don't
# id = models.AutoField(primary_key=True)
inspection = ForeignKey(Inspection, ...)
date = models.DateField(null=True) # you should have a default then
comment = models.CharField(max_length=255, blank=True default="")
signature = models.CharField(max_length=255, blank=True, default="")
class Group(models.Model):
inspection = models.OneToOneField(Inspection, null=True, blank=True)
class Site(models.Model):
inspection = models.OneToOneField(Inspection, null=True, blank=True)
এবং তারপরে আপনি কোনও প্রদত্ত সাইট বা গোষ্ঠীর জন্য সমস্ত প্রতিবেদন পেতে পারেন yoursite.inspection.inspectionreport_set.all()
।
এটি কোনও নির্দিষ্ট সীমাবদ্ধতা বা বৈধতা যুক্ত করতে এড়ায় না, তবে অতিরিক্ত ইন্ডাইরেশন লেভেলের (এসকিউএল join
ক্লজ ইত্যাদি) ব্যয় করে।
এই সমাধানগুলির মধ্যে কোনটি "সেরা" হবে তা প্রকৃতপক্ষে প্রাসঙ্গিক নির্ভর, সুতরাং আপনার উভয়েরই বোঝা বুঝতে হবে এবং আপনার নিজের প্রয়োজনের জন্য কোনটি উপযুক্ত। এটির জন্য আপনি সাধারণত কীভাবে আপনার মডেলগুলি ব্যবহার করেন তা যাচাই করতে হবে। যতদূর আমি উদ্বিগ্ন এবং আরও প্রসঙ্গ ছাড়াই (বা সন্দেহের ভিত্তিতে) আমি বরং সমাধানটি কম ইন্ডিরিশন লেভেলের সাথে ব্যবহার করব, তবে ওয়াইএমএমভি।
জেনেরিক সম্পর্কের বিষয়ে এনবি: যখন আপনার কাছে সত্যিকারের অনেকগুলি সম্পর্কিত সম্পর্কিত মডেল থাকে এবং / বা কোন মডেলগুলি আপনার নিজের সাথে সম্পর্কযুক্ত করতে চাইবে তা আগে জানা থাকে না সেগুলি কার্যকর হতে পারে। এটি পুনরায় ব্যবহারযোগ্য অ্যাপ্লিকেশনগুলির জন্য (ভাবুন "মন্তব্যগুলি" বা "ট্যাগগুলি" ইত্যাদি বৈশিষ্ট্যগুলি) বা এক্সটেনসিবল অ্যাপ্লিকেশনের জন্য (সামগ্রী সামগ্রী ফ্রেমওয়ার্ক ইত্যাদি) বিশেষভাবে কার্যকর। ক্ষতিটি হ'ল এটি অনেক ভারী জিজ্ঞাসাবাদ করে তোলে (এবং আপনি যখন আপনার ডিবিতে ম্যানুয়াল অনুসন্ধান করতে চান তখন বরং ব্যবহারিক হয় না)। অভিজ্ঞতা থেকে, তারা দ্রুত একটি পিআইটিএ বট আর্ট / কোড এবং পারফস হয়ে উঠতে পারে, তখন এর চেয়ে আরও ভাল সমাধান যখন না থাকে (এবং / অথবা যখন রক্ষণাবেক্ষণ এবং রানটাইম ওভারহেড কোনও সমস্যা না হয়)।
আমার 2 সেন্ট।
Inspection
এবং তারপরে অ-সাধারণ অংশগুলিতেSiteInspection
এবং এরGroupInspection
জন্য সাবক্লাস করতে পারেন ।