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
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
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
@ Satoru.Logic Qu'est-ce qu'une valeur de champ appelable? Comment appelez-vous une valeur? – hekevintran