Python Django-如何修复唯一约束字段
我正在做一个爱好项目,我有以下模型:Python Django-如何修复唯一约束字段,python,django,Python,Django,我正在做一个爱好项目,我有以下模型: from django.contrib.auth.models import User from django.db import models class Group(models.Model): name = models.CharField(blank=False, max_length=25) description = models.CharField(max_length=50, blank=True) user = m
from django.contrib.auth.models import User
from django.db import models
class Group(models.Model):
name = models.CharField(blank=False, max_length=25)
description = models.CharField(max_length=50, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=False)
def __str__(self):
return self.name
class Meta:
ordering = ('name', )
# my intention is that one user cannot have more than one group with the same name
unique_together = ('name', 'user')
我想让用户能够使用这个基于类的通用视图创建新的组
from django.urls import reverse_lazy
from django.views import generic
from groups.models import Group
class GroupCreate(generic.CreateView):
model = Group
fields = [
'name',
'description'
]
success_url = reverse_lazy('ideas:list')
template_name = 'groups/group_create.html'
def form_valid(self, form):
form.instance.user = self.request.user
return super(GroupCreate, self).form_valid(form)
只要我不试图通过发送现有组的名称来出错,一切都会正常工作。但是如果我发送一个现有组的名称(同一个用户!),我会得到以下错误:
IntegrityError at /groups/create
UNIQUE constraint failed: groups_group.name, groups_group.user_id
为什么会发生这种情况?我如何修复它或捕捉错误
我使用的是Django 2.0.2,您可以在创建组时进行检查
from django.contrib import messages
def form_valid(self, form):
form.instance.user = self.request.user
name = form.cleaned_data['name']
if Group.objects.filter(name=name, user=self.request.user).exists():
messages.error(self.request, 'An Group with this name already exists.')
return self.render_to_response(self.get_context_data(form=form))
else:
form.instance.name= name
messages.success(self.request, 'Congratulations!! Your Group is created successfully.')
return super(GroupCreate, self).form_valid(form)
发生这种情况的原因是您声明了一个约束:
unique_together = ('name', 'user')
只需删除此约束。我不希望组的名称是唯一的。我希望它与用户一起是唯一的。因此,一个用户只能有一个同名的组。但是两个用户可以有任何同名的组。@Johnny,我已经更新了我的答案。看看吧,很高兴它起了作用。谢谢。我发现了一个bug,一行修复了。什么,你做了筛选(name=name,user=user)??