python - español - Django unique_together no evita duplicados
django wikipedia (4)
Como aganders3 menciona, la restricción se aplica en el nivel de la base de datos; Aunque supongo que está utilizando una base de datos como SQLite que no admite este tipo de restricción.
La razón por la que todo funciona como se espera a través del administrador es que está haciendo la comprobación de la singularidad en sí misma (no se basa estrictamente en la base de datos para señalar violaciones de restricciones).
Puede cambiar a un motor de base de datos que admita este tipo de restricción de unicidad (ya sea que MySQL o Postgres funcionaría) o podría agregar la verificación utilizando señales: http://djangosnippets.org/snippets/1628/
Claramente no estoy entendiendo cómo hacer esto correctamente, ¿alguien me puede aclarar? Aquí está el modelo:
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")
Si lo envío dos veces seguidas se guarda todo. ¡Ay!
Encontré este enfoque útil sin agregar campos innecesarios
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
Pruebe la sintaxis de la tupla anidada adecuada ((foo,bar),)
lugar de solo (foo, bar)
?
https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together
Sí, el parámetro unique_together recibe como entrada una tupla de tuplas, no he probado tuplas de más de dos elementos pero debería funcionar
para su ejemplo:
unique_together = (("teamID", "name"), ("slug", "teamNumber"))
o:
unique_together = (("teamID", "name", "slug", "teamNumber", "totalScore"))