【发布时间】:2019-04-15 19:29:53
【问题描述】:
我有一个模型,用户作为 1 个字段(外键)和另一个字段技能组。我需要确保用户没有添加重复的技能组,所以我添加了 UniqueConstraint。这是因为系统在 /skillgroup/create/ 处出现 IntegrityError 错误 重复键值违反唯一约束“unique_skillgroup” - 如何捕获此异常并在重复时通知用户;否则保存?
Django/Python/Postgres 的新手,我认为我可以通过覆盖 save() 函数来处理它,但是无法访问用户,这是检查的一部分,我已经阅读过这不应该在这里处理。是否有我应该使用的尝试/保存捕获/消息?我尝试了一些没有运气的事情。我在这里看到过类似的问题,但它们没有帮助。任何帮助表示赞赏。
models.py
class SkillGroup(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
skill_group = models.CharField(max_length=35)
sequence = models.IntegerField(default=999)
class Meta:
constraints = [
models.UniqueConstraint(fields=['user', 'skill_group'], name='unique_skillgroup'),
]
def __str__(self):
return self.skill_group
def get_absolute_url(self):
return reverse('skillgroup-list')
views.py
class SkillGroupCreateView(LoginRequiredMixin, CreateView):
model = SkillGroup
fields = ['skill_group']
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.sequence = SkillGroup.objects.filter(user=self.request.user).order_by('sequence').last().sequence + 1
return super().form_valid(form)
skillgroup_form.html
{% extends "recruiter/baseskills.html" %}
{% load crispy_forms_tags %}
{% block content%}
<div class="content-section">
<form method="post">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Skill Group</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Add Skill Group</button>
</div>
</form>
</div>
{% endblock content%}
我想捕获异常并保存记录(如果不是重复的),或者在屏幕上显示“技能组已存在”的消息并将用户留在创建页面上。另外,如果这是最好的解决方案,我可以删除 UniqueConstraint 并使用代码处理。
【问题讨论】:
标签: django duplicates unique-constraint