Ответ 1
Попробуйте использовать правильный синтаксис вложенных кортежей ((foo,bar),)
вместо (foo, bar)
?
https://docs.djangoproject.com/en/dev/ref/models/options/#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!!!
Попробуйте использовать правильный синтаксис вложенных кортежей ((foo,bar),)
вместо (foo, bar)
?
https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together
Как сообщают aganders3, ограничение применяется на уровне базы данных; Я предполагаю, что вы используете базу данных, такую как SQLite, которая не поддерживает такой тип ограничений.
Причина, по которой все работает, как ожидается, через администратора, заключается в том, что он выполняет проверку уникальности (он не полагается строго на базу данных на нарушения ограничений связи).
Вы можете переключиться на механизм базы данных, который поддерживает это ограничение уникальности (либо MySQL, либо Postgres будет работать), либо вы можете посмотреть добавление проверки с использованием сигналов: http://djangosnippets.org/snippets/1628/
Да, пареметр unique_together получает в качестве кортежа кортежей кортежей, я не тестировал кортежи из более чем двух элементов, но он должен работать
для вашего примера:
unique_together = (("teamID", "name"), ("slug", "teamNumber"))
или:
unique_together = (("teamID", "name", "slug", "teamNumber", "totalScore"))
Я нашел этот подход полезным, не добавляя лишних полей
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