Кеширование базы данных Django - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть форма 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

Ответы [ 2 ]

1 голос
/ 16 апреля 2010

Нет, значение не будет кэшировано. Ваш второй пример - правильный путь.

(Первый фрагмент фактически содержит ошибку, в которой ничего не возвращается из метода clean, поэтому атрибут id_a будет пустым.)

0 голосов
/ 16 апреля 2010

Этот запрос не кэшируется. вызовы get () никогда не бывают. QuerySets, с другой стороны, (иногда) кэшируются после первой оценки.

...