繁体   English   中英

Django数据库缓存

[英]Django database caching

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

不,该值不会被缓存。 您的第二个示例是正确的方法。

(第一个代码段实际上包含一个错误,因为clean方法未返回任何内容,因此id_a属性最终将为空。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM