দম্পতি হিসাবে দুটি ক্ষেত্রকে "অনন্য" কীভাবে সংজ্ঞায়িত করবেন


387

জ্যাঙ্গোতে বেশ কয়েকটি ক্ষেত্রকে অনন্য হিসাবে সংজ্ঞায়িত করার কোনও উপায় আছে কি?

আমার কাছে ভলিউমের একটি টেবিল রয়েছে (জার্নালের) এবং আমি একই জার্নালের জন্য আরও একটি ভলিউম নম্বর চাই না।

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

আমি unique = Trueক্ষেত্রগুলিতে অ্যাট্রিবিউট হিসাবে রাখার চেষ্টা করেছি journal_idএবং volume_numberএটি কার্যকর হয় না।

উত্তর:


633

আপনার জন্য অনন্য_সমস্ত বলা হয় এমন একটি সহজ সমাধান রয়েছে যা আপনি যা চান ঠিক তা করে।

উদাহরণ স্বরূপ:

class MyModel(models.Model):
  field1 = models.CharField(max_length=50)
  field2 = models.CharField(max_length=50)

  class Meta:
    unique_together = ('field1', 'field2',)

এবং আপনার ক্ষেত্রে:

class Volume(models.Model):
  id = models.AutoField(primary_key=True)
  journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
  volume_number = models.CharField('Volume Number', max_length=100)
  comments = models.TextField('Comments', max_length=4000, blank=True)

  class Meta:
    unique_together = ('journal_id', 'volume_number',)

2
আমি বলব আপনি "বৈধকরণেরর" ব্যতিক্রম পাবেন। জ্যাঙ্গো ডক্সটি একবার দেখুন: Model. માન્યate_unique
জেনস

2
যদি ভলিউম_নামারটি বাতিল হয়ে যায় তবে আপনি কীভাবে এটি বলবেন? মাইকিউএলএলটি সে ক্ষেত্রে অনন্য প্রয়োগ করবে বলে মনে হবে না।
গ্রেগ

26
FYI এটি একটি django.db.utils.IntegrityError নিক্ষেপ করে যদি আপনি একটি সদৃশ যোগ করার চেষ্টা করেন।
অরণী

8
@ গ্রেগ - এএনএসআই স্ট্যান্ডার্ড এসকিউএল: 2003 (এবং পূর্ববর্তীগুলিরও) অনুসারে, একটি UNIQUEসীমাবদ্ধতার অনুলিপিটিকে নন- NULLমানগুলি নিষিদ্ধ করা উচিত , তবে একাধিক NULLমানকে মঞ্জুরি দেওয়া উচিত (ড্রাফ্ট উইসকর্প.com / sql_2003_standard.zip , ফ্রেমওয়ার্ক, পৃষ্ঠা 22)। আপনি যদি চান যে আপনার অনন্য বাধা একাধিক নাল মানকে অস্বীকার করে, আপনি সম্ভবত কিছু ভুল করছেন, NULLযেমন অর্থবহ মান হিসাবে ব্যবহার করার মতো। মনে রাখবেন, অযোগ্য ক্ষেত্রটি বলছে "আমাদের কাছে সর্বদা সেই ক্ষেত্রটির জন্য কোনও মূল্য থাকে না তবে আমরা যখন করি তখন এটি অবশ্যই অনন্য।"

2
একাধিক unique_togetherবাধা সম্পর্কে কি ? উদাহরণস্বরূপ - যখন আমি মোডের কলামগুলি পিতামাতার ক্ষেত্রে অনন্য হতে চাই? ওয়েল, এই সম্পত্তি আসলে একটি tuple নিজেই, দেখুন: docs.djangoproject.com/en/1.4/ref/models/options/... সুতরাং আপনার বাধ্যতা আরো স্পষ্টভাবে হিসেবে লেখা হওয়া উচিত: unique_together = (('journal_id', 'volume_number',),)
টমাসজ গ্যান্ডার

76

জ্যাঙ্গো ২.২++

constraintsবৈশিষ্ট্যগুলি ব্যবহার UniqueConstraintকরে অনন্য_সমস্তভাবে পছন্দ করা হয়

জাজানো ডকুমেন্টেশন এর জন্য unique_together:

পরিবর্তে সীমাবদ্ধতার বিকল্পের সাথে ইউনিককন্ট্রেন্ট ব্যবহার করুন।
ইউনিককন্ট্রেন্টটি ইউনিক_ সম্পূর্ণরূপে বেশি কার্যকারিতা সরবরাহ করে।
ভবিষ্যতে অনন্য_ সামগ্রিকভাবে হ্রাস করা যেতে পারে।

উদাহরণ স্বরূপ:

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name="Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['journal_id', 'volume_number'], name='name of constraint')
        ]

কোন পরিস্থিতিতে ইউনিককন্সট্রেন্টের 'নাম' প্যারামিটার ব্যবহার করা হবে? আমি ধরে নিলাম এটি কোনও URL পাথের নামের প্যারামিটারের মতো কাজ করে?
ব্যবহারকারী 7733611

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

এটি 100% নিশ্চিত হওয়ার পরে UniqueConstraintনয় তবে psycopg2.errors.DuplicateTable: relation "name_of_the_constraint" already exists
পোস্টগ্র্রেসে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.