2011-11-23 16 views
5

मैं एक मॉडल है कि ऐसा दिखाई देता है:, अबDjango सशर्त अद्वितीय एक साथ

class LibraryEntry(models.Model): 
    host_lib_song_id = models.IntegerField() 
    song = models.CharField(max_length=200) 
    artist = models.CharField(max_length=200) 
    album = models.CharField(max_length=200) 
    owning_user = models.ForeignKey(User) 
    is_deleted = models.BooleanField(default=False) 

अगर मैं तो एक का चयन करें जहां is_deleted=False, host_lib_song_id और owning_user के संयोजन अद्वितीय होना चाहिए। मैं इसे कैसे व्यक्त कर सकता हूं?

+0

आप की कोशिश की है https://docs.djangoproject.com/en/dev/ref/models/options/#unique- साथ में, या यह काम नहीं करेगा क्योंकि वे केवल 'अद्वितीय हैं अगर' is_deleted = गलत है? – bouteillebleu

+1

हाँ, मैंने कोशिश की। लेकिन मेरा is_deleted = झूठा उसमें एक बंदर रिंच फेंकता है। –

उत्तर

10

अधिभावी validate_unique विशिष्टता की जाँच करने के लिए यदि is_deletedFalse अधिक उपयुक्त है है:

... 

def validate_unique(self, exclude=None): 
    if not self.is_deleted and \ 
     LibraryEntry.objects.exclude(pk=self.pk).filter(host_lib_song_id=self.host_lib_song_id, owning_user=self.owning_user).exists(): 
     raise ValidationError('Some error message about uniqueness required') 
    super(LibraryEntry, self).validate_unique(exclude=exclude) 
+0

'पेजसेक्शन' चीज़ के साथ क्या है? क्या यह एक टाइपो है? साथ ही, मुझे लगता है कि मैं 'self.is_deleted'' चाहता हूं क्योंकि मैं केवल उन चीज़ों पर इसे लागू करना चाहता हूं जो _aren't_ हटा दिए गए हैं। सही? –

+0

दोनों खातों पर सही। इसे एक प्रोजेक्ट बनाएं जिस पर मैं काम कर रहा हूं और सब कुछ नहीं पकड़ा। उत्तर अपडेट किया गया। –

+1

एक साथ डेटाबेस की बाधा उत्पन्न नहीं करता है? 'Validate_unique' को ओवरराइड करने से Django को विशिष्टता जांच चलाने से रोका जा सकता है, लेकिन जब आप डीबी को सहेजने का प्रयास करते हैं तो आपको एक अखंडता त्रुटि मिल जाएगी। – Alasdair

4

आप Meta.unique_together बाधा के माध्यम से इस व्यक्त नहीं कर सकते, लेकिन django's model validation के माध्यम से:

class LibraryEntry(models.Model): 
    def clean(self): 
     from django.core.exceptions import ValidationError 
     try: 
      # try to find a duplicate entry and exclude 'self' 
      duplicate = LibraryEntry.objects.exclude(pk=self.pk)\ 
       .get(owning_user=self.owning_user, 
        host_lib_song_id=self.host_lib_song_id, 
        is_deleted=False) 
      raise ValidationError('Library Entry already exists!') 
     except: LibraryEntry.DoesNotExist: 
      # no duplicate found 
      pass 
संबंधित मुद्दे