2011-11-23 40 views
5

Tôi có một mô hình trông giống như sau:Django có điều kiện độc đáo cùng

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) 

Bây giờ, nếu tôi vì vậy chọn nơi is_deleted=False, sự kết hợp của host_lib_song_idowning_user phải là duy nhất. Làm thế nào tôi có thể diễn tả điều này?

+0

Các bạn đã thử https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together, hoặc điều đó sẽ không hoạt động vì chúng chỉ duy nhất nếu 'is_deleted = False'? – bouteillebleu

+1

Yea, tôi đã thử điều đó. Nhưng is_deleted của tôi = False ném một cờ lê khỉ trong đó. –

Trả lời

10

Overriding validate_unique để kiểm tra sự độc đáo nếu is_deletedFalse là thích hợp hơn:

... 

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

Điều gì với mục 'PageSection'? Đó có phải là lỗi đánh máy không? Ngoài ra, tôi nghĩ rằng tôi muốn 'nếu self.is_deleted' bởi vì tôi chỉ muốn thực thi điều này trên những thứ mà _aren't_ bị xóa. Đúng? –

+0

Chính xác trên cả hai tài khoản. Sao chép nó tạo thành một dự án tôi đang làm việc và không nắm bắt được mọi thứ. Đã cập nhật câu trả lời. –

+1

Không độc đáo với nhau tạo ra một hạn chế cơ sở dữ liệu? Việc ghi đè 'validate_unique' sẽ ngăn Django chạy kiểm tra tính duy nhất, nhưng sau đó bạn sẽ nhận được lỗi toàn vẹn khi bạn cố lưu vào db. – Alasdair

4

Bạn không thể diễn tả điều này thông qua các Meta.unique_together hạn chế, nhưng qua 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 
Các vấn đề liên quan