我知道如何使用
等值来获取或创建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那样做吗?
答案 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