2010-04-16 5 views
2

J'ai un formulaire Django qui utilise un champ d'entier pour rechercher un objet modèle par sa clé primaire. Le formulaire a une méthode save() qui utilise l'objet de modèle référencé par le champ entier. La méthode du modèle de gestionnaire de get() est appelé deux fois, une fois dans la méthode propre et une fois dans la méthode save():Mise en cache de base de données Django

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 

Je ne savais pas si cela touche la base de données deux fois ou une fois si je suis retourné l'objet lui-même dans la méthode propre afin que je puisse éviter un deuxième appel get(). Est-ce que appeler get() a frappé la base de données deux fois? Ou est l'objet mis en cache dans le fil?

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 

Répondre

1

Non, la valeur ne serait pas mise en cache. Votre deuxième exemple est la bonne façon de procéder.

(Le premier extrait contient en fait une erreur dans la mesure où rien n'est retourné par la méthode propre, donc l'attribut id_a finirait vide.)

0

Cette requête n'est pas mise en cache. Les appels get() ne le sont jamais. D'autre part, les QuerySets sont (parfois) mis en cache après la première évaluation.

+0

Dans ce cas, est la façon dont j'évitais le deuxième appel un bon façon de le faire? Ou y a-t-il une manière canonique de Django de le faire? – hekevintran

+0

avec des jeux de requêtes toutes les valeurs de champ non appelables sont mises en cache, tandis que les valeurs appelables ne le sont pas – satoru

+0

@ Satoru.Logic Qu'est-ce qu'une valeur de champ appelable? Comment appelez-vous une valeur? – hekevintran

Questions connexes