Django unique_together不能防止重复

时间:2012-01-13 00:16:55

标签: python django

我显然不明白如何正确地做到这一点,有人可以让我直截了当。这是模型:

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

如果我连续两次提交,则会保存所有内容。让人惊讶!!!

4 个答案:

答案 0 :(得分:22)

正如aganders3所提到的那样,约束是在数据库级别强制执行的;我假设您使用的SQLite数据库不支持这种约束。

它通过管理员按预期工作的原因是它正在进行唯一性检查(它不严格依赖数据库来发出约束违规信号)。

您可以切换到支持这种唯一性约束的数据库引擎(MySQL或Postgres可以工作),或者您可以查看使用信号添加签入:http://djangosnippets.org/snippets/1628/

答案 1 :(得分:12)

尝试使用正确的嵌套元组语法((foo,bar),)而不只是(foo, bar)

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

答案 2 :(得分:8)

是的,参数唯一一起作为输入接收元组的元组,我没有测试过两个以上元素的元组但它应该可以工作

为您的例子:

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

或:

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

答案 3 :(得分:1)

我发现这种方法很有帮助而不添加任何不必要的字段

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