在模型对象上使用get_or_create的正确方法

时间:2014-11-14 11:19:04

标签: django orm

我知道如何使用

等值来获取或创建
Car.get_or_create(name="Canro", model=2012 ... .. many other fields)

但是当我使用django表格添加或更新汽车对象时,如何检查用户是否已进入已经在数据库中的汽车?

一种方法可能是,

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那样做吗?

2 个答案:

答案 0 :(得分:1)

我把这个逻辑放在我的观察中form_valid就像这样:

def form_valid(self, form):
    self.object, created = Car.objects.get_or_create(
        **form.cleaned_data
    )
    return super(CarCreateView, self).form_valid(form)

为了说明这一点,我有一个投诉案件管理系统,可以分阶段登记新的投诉。当有人想要投诉时,他们的详细信息会存储在Complainant模型中,该模型会为某人的第一次投诉创建新投诉人,但对后续投诉不起作用。然后将它们重定向到Case模型表单及其id值,该值将自动添加为Case对象的外键到Complainant对象。该模型形式如下所示:

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],
            )
        )

答案 1 :(得分:-1)

以表格的clean方式执行:

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