Подтвердить что ты не робот

Django unique_together не предотвращает дублирование

Я явно не понимаю, как это сделать правильно, может кто-то меня прямо посадил. Вот модель:

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")

Если я отправляю дважды подряд, он сохраняет все это. Yikes!!!

4b9b3361

Ответ 2

Как сообщают aganders3, ограничение применяется на уровне базы данных; Я предполагаю, что вы используете базу данных, такую ​​как SQLite, которая не поддерживает такой тип ограничений.

Причина, по которой все работает, как ожидается, через администратора, заключается в том, что он выполняет проверку уникальности (он не полагается строго на базу данных на нарушения ограничений связи).

Вы можете переключиться на механизм базы данных, который поддерживает это ограничение уникальности (либо MySQL, либо Postgres будет работать), либо вы можете посмотреть добавление проверки с использованием сигналов: http://djangosnippets.org/snippets/1628/

Ответ 3

Да, пареметр unique_together получает в качестве кортежа кортежей кортежей, я не тестировал кортежи из более чем двух элементов, но он должен работать

для вашего примера:

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

или:

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

Ответ 4

Я нашел этот подход полезным, не добавляя лишних полей

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