Сбой УНИКАЛЬНОГО ограничения: groups_groupmember.group_id, groups_groupmember.user_id

#python #django #django-models #django-views #django-templates

#python #django #django-модели #django-просмотры #django-шаблоны

Вопрос:

Я работаю над небольшим проектом django, и для этого я создал одну функциональность, которая позволяет пользователю создавать и затем присоединяться к группе.

Итак, вот в чем проблема :

всякий раз, когда я покидаю группу и пытаюсь присоединиться к ней, отображается ошибка, о которой я упоминал в вопросе

«Сбой УНИКАЛЬНОГО ограничения: groups_groupmember.group_id, groups_groupmember.user_id»

вот мой класс join :

 class JoinGroup(LoginRequiredMixin, generic.RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        return reverse('groups:single', kwargs={'slug': self.kwargs.get('slug')})

    def get(self, request, *args, **kwargs):
        group = get_object_or_404(Group, slug=self.kwargs.get('slug'))

        from sqlite3 import IntegrityError
        try:
            # GroupMember.objects.create(group=group)
            GroupMember.objects.create(user=self.request.user, group=group)

        except IntegrityError:
            messages.warning(self.request, 'already a member!')

        else:
            messages.success(self.request, 'You are now a member!')

        return super().get(request, *args, **kwargs)


  

Вот мой models.py

 from django.db import models
from django.utils.text import slugify
from django.urls import reverse

# Create your models here.
# GROUPS MODELS.PY
import markdown

from django.contrib.auth import get_user_model  # returns user model that currently active in this project

User = get_user_model()

from django import template

register = template.Library()


class Group(models.Model):
    name = models.CharField(max_length=256, unique=True)
    slug = models.SlugField(allow_unicode=True, unique=True)
    description = models.TextField(blank=True, default='')
    description_html = models.TextField(editable=False, default='', blank=True)
    members = models.ManyToManyField(User, through='GroupMember')

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        self.description_html = markdown.markdown(self.description)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('groups:single', kwargs={'slug': self.slug})

    class Meta:
        ordering = ['name']


class GroupMember(models.Model):
    group = models.ForeignKey(Group, related_name='memberships', on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name='user_groups', on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

    class Meta:
        unique_together = ('group', 'user')

  

Не могли бы вы помочь мне решить эту проблему? Спасибо! 🙂

Комментарии:

1. можете ли вы предоставить models.py ?

Ответ №1:

Как насчет использования get_or_create

 class JoinGroup(LoginRequiredMixin, generic.RedirectView):
    def get_redirect_url(self, *args, **kwargs):
        return reverse('groups:single', kwargs={'slug': self.kwargs.get('slug')})

    def get(self, request, *args, **kwargs):
        group = get_object_or_404(Group, slug=self.kwargs.get('slug'))
        _, created = GroupMember.objects.create(user=request.user, group=group)
        if not created:
            messages.warning(request, 'already a member!')
        else:
            messages.success(request, 'You are now a member!')
        return super().get(request, *args, **kwargs)
  

Комментарии:

1. но как насчет IntegrityError?

2. Используйте его, если вам нужно выполнить откат docs.djangoproject.com/en/3.1/topics/db/transactions /…