2011-11-23 11 views
5

私は次のようなモデルがあります:どこis_deleted=Falsehost_lib_song_idowning_userの組み合わせはユニークである必要があり、私そう選択した場合は、今すぐジャンゴ条件ユニーク一緒

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) 

を。これをどのように表現できますか?

+0

は、あなたがhttpsを試してみました:/ /docs.djangoproject.com/ja/dev/ref/models/options/#unique-together、または 'is_deleted = False'の場合に一意であるために動作しませんか? – bouteillebleu

+1

そうです、私はそれを試みました。しかし、私のis_deleted = Falseはその中にサルのレンチを投げます。 –

答えて

10

がより適切である:

... 

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経由することはできません:is_deletedFalseであれば一意性をチェックするためにvalidate_uniqueをオーバーライド

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