युगल के रूप में दो क्षेत्रों "अद्वितीय" को कैसे परिभाषित करें


387

वहाँ Django में अद्वितीय रूप में खेतों के एक जोड़े को परिभाषित करने का एक तरीका है?

मेरे पास संस्करणों की एक तालिका है (पत्रिकाओं की) और मुझे एक ही पत्रिका के लिए अधिक मात्रा में एक संख्या नहीं चाहिए।

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
मैं कहूंगा कि आपको "वैधता" अपवाद मिलेगा। Django डॉक्स पर एक नज़र डालें: Model.validate_unique
Jens

2
अगर आप यह कहेंगे कि वॉल्यूम_नंबर कैसे अशक्त हो सकता है? उस मामले में मैसूर अद्वितीय को लागू नहीं करेगा।
ग्रेग

26
यदि आप कोई डुप्लिकेट जोड़ने का प्रयास करते हैं तो FYI करें यह django.db.utils.IntegrityError को फेंक देता है।
Araneae

8
@Greg - ANSI मानक SQL: 2003 (और पिछले वाले भी) के अनुसार, एक UNIQUEबाधा को नकली गैर- NULLमूल्यों को अस्वीकार करना चाहिए , लेकिन कई NULLमानों की अनुमति दें (मसौदा wiscorp.com/sql_2003_standard.zip , फ्रेमवर्क, पृष्ठ 22 देखें)। यदि आप चाहते हैं कि आपका अद्वितीय अवरोध कई अशक्त मूल्यों को अस्वीकार कर दे, तो आप शायद कुछ गलत कर रहे हैं, जैसे NULLकि एक सार्थक मूल्य के रूप में उपयोग करना । याद रखें, अशक्त क्षेत्र कहता है "हमारे पास हमेशा उस क्षेत्र के लिए कोई मूल्य नहीं होता है लेकिन जब हम ऐसा करते हैं तो यह अद्वितीय होना चाहिए।"

2
कई unique_togetherबाधाओं के बारे में क्या ? उदाहरण के लिए - जब मैं माता-पिता के दायरे में अद्वितीय होने के लिए मोड कॉलम रखना चाहता हूं? खैर, इस संपत्ति वास्तव में एक टपल ही है, देखें: docs.djangoproject.com/en/1.4/ref/models/options/... तो अपने बाधा अधिक स्पष्ट रूप में लिखा होना चाहिए: unique_together = (('journal_id', 'volume_number',),)
टॉमस गैंडर

76

Django 2.2+

constraintsफीचर्स UniqueConstraintका उपयोग करना Unique_t पूरी तरह से पसंद किया जाता है

के लिए Django प्रलेखन से unique_together:

इसके बजाय बाधाओं के विकल्प के साथ UniqueConstraint का उपयोग करें।
UniqueConstraint, unique_t पूरी तरह से अधिक कार्यक्षमता प्रदान करता है।
भविष्य में यूनिक_ट्रेड को अपदस्थ किया जा सकता है।

उदाहरण के लिए:

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')
        ]

किस स्थिति में UniqueConstraint के 'नाम' पैरामीटर का उपयोग किया जाएगा? मुझे लगता है कि यह URL पथ के नाम पैरामीटर की तरह काम करता है?
user7733611

1
@ user7733611 बाधा का नामकरण कई स्थितियों में मददगार हो सकता है। उदाहरण के लिए यदि आप एक विरासत डेटाबेस से जुड़ रहे हैं, या यदि आप चाहते हैं कि बाधा नाम डेटाबेस में अधिक मानवीय पठनीय हो। एक बार जब मैंने एक MySQL डेटाबेस के चरित्र सेट को माइग्रेट किया और Django के उत्पन्न बाधा नाम वास्तव में हमारे विशेष लक्ष्य के लिए बहुत लंबे थे।
15

नहीं 100% यकीन है कि यह से आता है, UniqueConstraintलेकिन मैं अजीब हो जाता है psycopg2.errors.DuplicateTable: relation "name_of_the_constraint" already existsजब मैं Postgres पर स्विच करता हूं
zar3bski
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.