如何在Django CreateView中返回已匹配的现有记录?
Django实现GetOrCreate功能的简洁方案
我使用Django自带的generic.edit.CreateView根据用户输入创建对象,我的MyModel带有UniqueConstraint约束,因此当新对象与现有记录匹配时,创建操作会失败。
但我不想告知用户“因重复记录导致创建失败”,而是直接返回已存在的对象——这才是用户实际需要的结果。
我尝试过重写表单的save方法:
def save(self, commit=True): return MyModel.get_or_create(value=self.cleaned_data['value'])[0]
但这个方法无效,因为form._post_clean会调用form.instance.full_clean,该方法默认参数validate_constraints=True,导致在表单验证阶段就会返回错误。
本质上我需要一个GetOrCreateView,但不确定除了重写form._full_clean之外,有没有更简洁的实现方式。注:我不需要UpdateView,因为无法提前预知要返回哪个现有对象。
编辑:在长时间处理验证问题后,我最终放弃了CreateView,转而使用更简单的FormView。FormView会先收集所有用户输入,然后在form_valid(self, form)方法中调用get_or_create(form.cleaned_data[...])来实现需求。
内容的提问来源于stack exchange,提问作者user2283347
相关产品推荐
相关产品推荐

