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