唯一约束失败:groups_groupmember.group_id,groups_groupmember.user_id

时间:2020-10-05 07:09:26

标签: python django django-models django-views django-templates

我正在从事一个小型django项目,为此,我创建了一个功能,允许用户创建然后加入该小组。

现在,这是问题所在:

每当我离开小组并尝试重新加入小组时,都会显示我在问题中提到的错误

“唯一约束失败:groups_groupmember.group_id,groups_groupmember.user_id”

这是我的加入课程:

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 个答案:

答案 0 :(得分:0)

如何使用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)