2011-11-23 12 views
5

Mam modelu, który wygląda tak:Django warunkowy wyjątkowy razem

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) 

Teraz, gdybym tak select gdzie is_deleted=False kombinacja host_lib_song_id i owning_user powinien być unikalny. Jak mogę to wyrazić?

+0

Czy próbowałeś https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together, czy też nie zadziałałoby, ponieważ są one unikalne tylko wtedy, gdy 'is_deleted = False'? – bouteillebleu

+1

Tak, próbowałem tego. Ale my is_deleted = False rzuca w to klucz małpy. –

Odpowiedz

10

Zastępowanie validate_unique sprawdzić unikalność jeśli is_deleted jest False jest bardziej odpowiedni:

... 

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

Co jest z rzeczą "PageSection"? Czy to literówka? Ponadto, myślę, że chcę 'if self.is_deleted', ponieważ chcę tylko wymusić to na rzeczy, które _aren't_ usunięte. Dobrze? –

+0

Poprawnie na obu kontach. Skopiowałem to z projektu, nad którym pracuję i nie złapałem wszystkiego. Odpowiedź zaktualizowana. –

+1

Czy unikatowy razem generuje ograniczenie bazy danych? Zastąpienie 'validate_unique' uniemożliwi Django przeprowadzanie sprawdzania unikalności, ale wtedy wystąpi błąd integralności podczas próby zapisania do bazy danych. – Alasdair

4

nie można wyrazić to poprzez Meta.unique_together przymusu, ale przez 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