Django 在模型对象上使用get_或_create的正确方法
我知道如何获取或创建这样的值Django 在模型对象上使用get_或_create的正确方法,django,orm,Django,Orm,我知道如何获取或创建这样的值 Car.get_or_create(name="Canro", model=2012 ... .. many other fields) 但是,当我使用django表单添加或更新car对象时,如何检查用户是否输入了已经在db中的car 一种可能是 have_in_db = Car.objects(name=user_entered.name) if have_in_db: have_in_db.model!=user_entered.model # man
Car.get_or_create(name="Canro", model=2012 ... .. many other fields)
但是,当我使用django表单添加或更新car对象时,如何检查用户是否输入了已经在db中的car
一种可能是
have_in_db = Car.objects(name=user_entered.name)
if have_in_db:
have_in_db.model!=user_entered.model
# many other fields.
我想试试那样的东西
Car.get_or_create(**user_entered)
我可以在django中这样做吗?我将此逻辑放在视图的形式中,如下所示: 考虑到这一点,我有一个投诉案例管理系统,分阶段登记新的投诉。当某人想要投诉时,他们的详细信息存储在投诉人模型中,该模型为某人的第一次投诉创建新投诉人,但不为后续投诉创建新投诉人。然后,它们连同id值一起重定向到案例模型表单,id值自动添加为案例对象的外键到投诉对象。该模型形式如下所示:
class ComplainantCreateView(PermissionRequiredMixin, CreateView):
model = Complainant
form_class = ComplainantForm
login_url = "/login/"
permission_required = "complaints.add_complainant"
def form_valid(self, form):
self.object, created = Complainant.objects.get_or_create(
**form.cleaned_data
)
return HttpResponseRedirect(
reverse(
'select_case',
args=[self.object.pk],
)
)
以表单的清洁方法执行此操作:
在保存表单之前,是否要检查是否有与中相同参数的汽车?是的。如果在我的模型Car中,有任何对象的参数与用户输入的参数相同。这不符合OP的要求。它返回一个已经存在的错误,而不是提取对象。@cms\u mgr如果需要更新对象,请使用UpdateView,而不是CreateView。如果你弄乱了模式,代码将很难维护和读取。我同意,但有些情况下,比如我的答案中所述的情况,你想创建一些东西,而不知道它所依赖的另一个对象是否已经存在。在这些情况下,get_或_create提供了比错误更好的用户体验。执行实际要求的操作。
class ComplainantCreateView(PermissionRequiredMixin, CreateView):
model = Complainant
form_class = ComplainantForm
login_url = "/login/"
permission_required = "complaints.add_complainant"
def form_valid(self, form):
self.object, created = Complainant.objects.get_or_create(
**form.cleaned_data
)
return HttpResponseRedirect(
reverse(
'select_case',
args=[self.object.pk],
)
)
from django.forms import ModelForm
from myapp.models import Car
class CarForm(ModelForm):
class Meta:
model = Car
def clean(self):
if self._meta.model.objects.filter(**self.cleaned_data).count() > 0:
raise forms.ValidationError('Car already exists')
return self.cleaned_data