[英]Django unique_together not preventing duplicates
我顯然不明白如何正確地做到這一點,有人可以讓我直截了當。 這是模型:
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")
如果我連續提交兩次,它會保存所有內容。 哎呀!!!
正如 aganders3 提到的,約束是在數據庫級別強制執行的; 我假設您使用的是像 SQLite 這樣不支持這種約束的數據庫。
這一切都通過管理員按預期工作的原因是它本身正在執行唯一性檢查(它不嚴格依賴於數據庫來發出約束違規信號)。
您可以切換到支持這種唯一性約束的數據庫引擎(MySQL 或 Postgres 都可以),或者您可以查看使用信號添加簽入: http : //djangosnippets.org/snippets/1628/
嘗試正確的嵌套元組語法((foo,bar),)
而不是(foo, bar)
?
https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together
是的,參數 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().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().save(*args, **kwargs)
def __str__(self):
return self.user.username + '------>' + self.requested_user.username
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.