У меня есть форма Django, которая использует целочисленное поле для поиска объекта модели по его первичному ключу. Форма имеет метод save()
, который использует объект модели, указанный в целочисленном поле. Метод get()
менеджера модели вызывается дважды, один раз в методе clean и один раз в методе save()
:
class MyForm(forms.Form):
id_a = fields.IntegerField()
def clean_id_a(user_id):
id_a = self.cleaned_data['id_a']
try:
# here is the first call to get
MyModel.objects.get(id=id_a)
except User.DoesNotExist:
raise ValidationError('Object does not exist')
def save(self):
id_a = self.cleaned_data['id_a']
# here is the second call to get
my_model_object = MyModel.objects.get(id=id_a)
# do other stuff
Я не был уверен, попадет ли это в базу данных два раза или один раз, поэтому я возвратил сам объект в методе clean, чтобы избежать второго get()
вызова. Звонит ли get()
в базу данных два раза? Или объект кешируется в потоке?
class MyForm(forms.Form):
id_a = fields.IntegerField()
def clean_id_a(user_id):
id_a = self.cleaned_data['id_a']
try:
# here is my workaround
return MyModel.objects.get(id=id_a)
except User.DoesNotExist:
raise ValidationError('Object does not exist')
def save(self):
# looking up the cleaned value returns the model object
my_model_object = self.cleaned_data['id_a']
# do other stuff