Django: запретить добавлять те же данные для пользователя - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть приложение, где пользователь может добавить 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 и позже будут отображаться некоторые сообщения

1 Ответ

1 голос
/ 24 февраля 2020

Используйте 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 для указанного пользователя c, обработайте уникальную ошибку для запретить пользователю добавлять указанный c URL дважды или более.

try:
   # add a Repository
except IntegrityError:
   # raise an error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...