2011-11-23 40 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=Falsehost_lib_song_idowning_user組合應該是唯一的。我如何表達這一點?

+0

您是否嘗試過的https:/ /docs.djangoproject.com/en/dev/ref/models/options/#unique-together,還是不行,因爲它們只有在'is_deleted = False'時纔是唯一的? – bouteillebleu

+1

是的,我試過了。但是我的is_deleted = False在那扔了一隻猴子扳手。 –

回答

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

什麼是'PageSection'的東西?這是一個錯字嗎?另外,我想我想要'如果self.is_deleted',因爲我只想強制這些事情不被刪除。對? –

+0

更正這兩個帳戶。複製它形成我正在進行的項目,並沒有抓住一切。答案已更新。 –

+1

不一起生成數據庫約束嗎?重寫'validate_unique'將會阻止Django運行唯一性檢查,但是當你嘗試保存到db時,你會得到一個完整性錯誤。 – 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