2012-01-13 21 views
20

Tôi rõ ràng không hiểu cách làm điều này một cách chính xác, ai đó có thể đặt tôi thẳng. Đây là mô hình:Django unique_together không ngăn cản các bản sao

class Team(models.Model): 
    teamID=models.CharField(max_length=255) #this will be generated on the iPad 
    name=models.CharField(max_length=255) 
    slug=models.SlugField(max_length=50) 
    teamNumber=models.CharField(max_length=30) 
    checkIn=models.DateTimeField(default=datetime.now()) 
    totalScore=models.IntegerField(max_length=6) 

    class Meta: 
     unique_together = ("teamID", "name", "slug", "teamNumber", "totalScore") 

Nếu tôi gửi hai lần liên tiếp, nó sẽ lưu tất cả. Yikes !!!

+0

Ngoài ra còn có một mô hình sử dụng mô hình này làm FK, tôi tự hỏi liệu có liên quan gì đến nó không? – jasongonzales

+0

Điều này được thực thi ở cấp cơ sở dữ liệu - bạn có nhớ chạy 'python manage.py syncdb' sau khi thêm trường' unique_together' không? – aganders3

+0

tốt, tôi đã chạy một di chuyển ... hãy để tôi thử chỉ là một đồng bằng 'ol đồng bộ – jasongonzales

Trả lời

10

Thử cú pháp lồng nhau thích hợp ((foo,bar),) thay vì chỉ (foo, bar)?

https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

+0

Tôi có ... vô ích, tôi chỉ cần thiếu một cái gì đó đơn giản ở đây – jasongonzales

+0

OK, đây là vấn đề, nếu tôi nhập dữ liệu trong quản trị Django * sẽ * ngăn chặn các mục trùng lặp, nhưng ứng dụng di động nhỏ lạ đang gửi dữ liệu ứng dụng Django của tôi không thể thực hiện bất kỳ xác thực nào như quản trị Django, cũng như không nhận được tin nhắn từ ứng dụng Django của tôi. Tôi chỉ cần Django không viết dữ liệu này chút nào. Tôi biết, đây là một trường hợp sử dụng kỳ lạ. – jasongonzales

+0

OK, vì vậy bây giờ tôi đã quyết định quay lại ứng dụng và gửi thông báo lỗi xác thực. Tôi nghĩ rằng điều này sẽ làm việc ngay bây giờ.Xin lỗi cho các báo động giả. – jasongonzales

8

Có những unique_together paremeter nhận như là đầu vào một tuple của các bộ, tôi đã không kiểm tra các bộ hơn hai yếu tố nhưng nó phải làm việc

ví dụ của bạn:

unique_together = (("teamID", "name"), ("slug", "teamNumber")) 

hoặc:

unique_together = (("teamID", "name", "slug", "teamNumber", "totalScore")) 
+1

Ví dụ thứ hai của bạn thiếu dấu phẩy theo sau được yêu cầu trong bộ phần tử 1 phần tử, làm cho nó trở thành một bộ dữ liệu có chiều dài là 4 với các phần bổ sung không có gì. Nó hoạt động, nhưng nó b/c Django không yêu cầu một bộ tuple nếu chỉ có 1 nhóm duy nhất. Vấn đề của tôi đã được giải quyết để đảm bảo rằng 'unique_together' nằm trong lớp Meta, không phải là mô hình. D'oh! – mattmc3

20

Vì aganders3 ment các ion ràng buộc được thực thi ở cấp cơ sở dữ liệu; Tôi cho rằng mặc dù bạn đang sử dụng một cơ sở dữ liệu như SQLite không hỗ trợ loại ràng buộc này.

Lý do tất cả hoạt động như mong đợi thông qua quản trị viên là nó đang thực hiện kiểm tra tính duy nhất (không dựa hoàn toàn vào cơ sở dữ liệu để vi phạm ràng buộc tín hiệu).

Bạn có thể chuyển sang một cơ sở dữ liệu có hỗ trợ loại này hạn chế tính độc đáo (MySQL hoặc Postgres sẽ làm việc) hoặc bạn có thể nhìn vào cách thêm dấu check ở mục sử dụng tín hiệu: http://djangosnippets.org/snippets/1628/

1

tôi thấy phương pháp này hữu ích mà không cần thêm bất kỳ trường nào không cần thiết

class Request(models.Model): 
user = models.ForeignKey(User, related_name='request_list', on_delete=models.CASCADE) 
requested_user = models.ForeignKey(User, on_delete=models.CASCADE) 
request_date = models.DateField(default=timezone.now()) 
request_status = models.BooleanField(default=False) 

def save(self, *args, **kwargs): 
    # Checking for duplicate requests 
    try: 
     request = Request.objects.get(user=self.user, requested_user=self.requested_user) 
     raise ValidationError('Duplicate Value', code='invalid') 
    except self.DoesNotExist: 
     super(Request, self).save(*args, **kwargs) 

    # checking for reversed duplicate requests 
    try: 
     request_new = Request.objects.get(requested_user=self.user, user=self.requested_user) 
     raise ValidationError('Duplicate Value', code='invalid') 
    except self.DoesNotExist: 
     super(Request, self).save(*args, **kwargs) 

def __str__(self): 
    return self.user.username + '------>' + self.requested_user.username 
Các vấn đề liên quan