Pracuję nad małym projektem Django i za to stworzyłem jedną funkcjonalność, która pozwala użytkownikowi tworzyć, a następnie dołączyć do grupy.

Teraz, oto problem:

Ilekroć opuszczam grupę i próbuję go ponownie dołączyć, pokazuje błąd, o którym wspomniałem w pytaniu

"Unikalne ograniczenie nie powiodło się: grupy_groupmember.group_id, grupy_groupmember.user_id"

Oto moja klasa dołączania:

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)


Oto moje modele.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')

Czy możesz pomóc mi rozwiązać ten problem? Dziękuję Ci ! :)

-1
stephen salvatore 5 październik 2020, 10:09

1 odpowiedź

Najlepsza odpowiedź

Co powiesz na użycie 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)
0
Waket Zheng 5 październik 2020, 07:39