Django数据库缓存
问题描述:
我有一个Django窗体,它使用整数字段通过主键查找模型对象。该表格有一个save()
方法,该方法使用由整型字段引用的模型对象。该模型的经理的get()
方法被调用了两次,一次是在清洁的方法,一次在save()
方法: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
我不知道这是否访问数据库两次或一次,所以我返回的对象本身干净的方法,以便我可以避免第二个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
答
不,该值不会被缓存。你的第二个例子是正确的路要走。
(第一个片段实际上包含了一个错误,在没有从清洁方法返回,所以id_a
属性将最终为空。)
答
该查询未被缓存。 get()调用永远不会。另一方面,QuerySets在第一次评估之后(有时)被缓存。
在这种情况下,是我避免了第二个电话的方式好如何做到这一点?或者是否有规范的Django方法来执行此操作? – hekevintran 2010-04-16 07:12:07
带查询集所有不可调用字段值都被缓存,而可调用字段值不是 – satoru 2010-04-16 07:23:44
@ Satoru.Logic什么是可调用字段值?你怎么称呼一个价值? – hekevintran 2010-04-16 07:49:24