У меня есть приложение, где пользователь может добавить URL в избранное в базе данных с отношениями ManyToMany. Таким образом, у каждого пользователя может быть много 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')
И в моем views:
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})
Функция Избранное вызывается по нажатой кнопке в моем шаблоне. Когда я нажимаю вышеупомянутую функцию выполняется и перенаправить в / избранное. Проблема в том, что когда я снова нажимаю на кнопку и я вошел в систему как тот же пользователь, этот URL снова добавляется в базу данных. Та же проблема с обновлением избранного. html. Есть ли какой-либо лог c способ решить эту проблему?
РЕДАКТИРОВАТЬ:
просмотреть избранное:
def favorites(request):
url = request.session.get('url')
try:
repo = Repository(url=url,user=request.user)
repo.save()
repo.repositorys.add(request.user)
user = User.objects.get(username=request.user.username)
except IntegrityError as e:
return render_to_response('base.html')
repos = user.users.all()
return render(request, 'favorites.html', {'url': url, 'repos': repos})
Моя идея здесь заключалась в том, чтобы верните все URL для пользователя, затем переместите добавление в блок try. Когда возникает IntegrityError, тогда переходите на базу. html и позже будут отображаться некоторые сообщения