Django unique_together未能阻止重复数据

27 投票
4 回答
30521 浏览
提问于 2025-04-17 10:08

我明显没有搞明白该怎么正确地做这个,有人能帮我理清思路吗?这是我的模型:

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 个回答

8

是的,unique_together这个参数接收的是一个元组的元组。我没有测试过包含超过两个元素的元组,但应该是可以工作的。

对于你的例子:

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

或者:

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

正如aganders3提到的,这个限制是在数据库层面上执行的;不过我猜您可能在使用像SQLite这样的数据库,它不支持这种限制。

之所以在管理界面上能正常工作,是因为它自己进行了唯一性检查(并不是完全依赖数据库来提示限制违规)。

您可以换一个支持这种唯一性限制的数据库,比如MySQL或Postgres,或者您也可以考虑通过信号来添加检查:http://djangosnippets.org/snippets/1628/

14

试试正确的嵌套元组写法 ((foo,bar),),而不是简单的 (foo, bar) 吧?

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

撰写回答