2011-11-23 13 views
5

Ho un modello che è simile al seguente:Django condizionale unico insieme

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) 

Ora, se io così un prescelto dove is_deleted=False, la combinazione di host_lib_song_id e owning_user deve essere univoco. Come posso esprimere questo?

+0

Hai provato https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together, o non funzionerebbe perché sono unici solo se 'is_deleted = False'? – bouteillebleu

+1

Sì, ci ho provato. Ma il mio is_deleted = False lancia in questo una chiave inglese. –

risposta

10

Overriding validate_unique per verificare l'univocità se is_deleted è False è più appropriato:

... 

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

Cosa c'è nella cosa 'PageSection'? È un errore di battitura? Inoltre, penso che voglio "se self.is_deleted" perché voglio solo far rispettare ciò che non è stato cancellato. Destra? –

+0

Corretto su entrambi i conti. Copiato da un progetto a cui sto lavorando e non ha catturato tutto. Risposta aggiornata –

+1

Univoco non genera un vincolo di database? Sovrascrivere 'validate_unique' impedirà a Django di eseguire i controlli di unicità, ma in questo caso si otterrebbe un errore di integrità quando si tenta di salvare in db. – Alasdair

4

Non si può esprimere questo attraverso il vincolo Meta.unique_together, ma attraverso 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 
Problemi correlati