2010-04-16 113 views
2

我有一个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 

回答

1

不,该值不会被缓存。你的第二个例子是正确的路要走。

(第一个片段实际上包含了一个错误,在没有从清洁方法返回,所以id_a属性将最终为空。)

0

该查询未被缓存。 get()调用永远不会。另一方面,QuerySets在第一次评估之后(有时)被缓存。

+0

在这种情况下,是我避免了第二个电话的方式好如何做到这一点?或者是否有规范的Django方法来执行此操作? – hekevintran 2010-04-16 07:12:07

+0

带查询集所有不可调用字段值都被缓存,而可调用字段值不是 – satoru 2010-04-16 07:23:44

+0

@ Satoru.Logic什么是可调用字段值?你怎么称呼一个价值? – hekevintran 2010-04-16 07:49:24