我有一个应用程序,用户可以通过它与ManyToMany关系将URL添加到数据库的收藏夹中。因此,每个用户可以有很多URL,每个URL可以有很多用户。我在创建限制以避免为用户添加相同的url时遇到问题。我的意思是我想创建一种机制,可以为用户增加url的时间,但每个用户只能增加一次。
在我的模型中,我有:
from django.db import models
from django.contrib.auth.models import User
class Repository(models.Model):
url = models.CharField(max_length=250,unique=False)
user = models.ForeignKey(User,related_name='user',on_delete=models.CASCADE,default='')
repositorys = models.ManyToManyField(User,related_name='user')
在我看来:
def favorites(request):
url = request.session.get('url')
repo = Repository(url=url,user=request.user)
repo.save()
repo.repositorys.add(request.user)
user = User.objects.get(username=request.user.username)
repos = user.users.all()
return render(request, 'favorites.html',{'url':url,'repos':repos})
收藏夹功能在模板中的单击按钮上被调用。当我单击上面的函数时,将重定向到/ favorites。问题是,当我再次单击按钮并且以同一用户身份登录时,该URL再次添加到数据库中。刷新favorites.html时也存在同样的问题。有没有解决此问题的逻辑方法?
在模型中使用unique_together在数据库级别管理唯一性
class Repository(models.Model):
url = models.CharField(max_length=250,unique=False)
user = models.ForeignKey(User,related_name='user',on_delete=models.CASCADE,default='')
class Meta:
unique_together = [['url', 'user']]
然后,当您想为特定用户添加URL时,请处理唯一性错误以防止用户两次或多次添加特定URL。
try:
# add a Repository
except IntegrityError:
# raise an error