在更新和检索带子项的模型实例时,如何在Django中使用memcache?

时间:2014-06-06 01:47:49

标签: python django memcached

我有一个现有的Django应用程序没有做任何数据库缓存。我正在努力实现memcached以提高性能并减少昂贵的数据库命中量。

到目前为止,我已安装并在我的服务器上运行memcache,安装了pymclibdjango-memcache-admin并修改了我的settings.py文件,正如我所描述的here。我还没有修改任何实际的应用程序代码。但是当我查看django-memcache-admin仪表板时,我仍然可以看到缓存有效。缓存也很明显,因为当我加载一些视图时,显示的数据已过时。 IE:更新的数据没有进入缓存。我需要有关如何解决此问题的建议。下面给出更详细的解释。

以下是我的模特:

class myObjectA(models.Model):  
    field1 = models.CharField(max_length=255)

    def modify(self):
        newB = myObjectB(fk_myObjectA=self, field2="Blah Blah")
        newB.save()

    def getBChildren(self):
        return myObjectB.objects.filter(fk_myObjectA=self)


class myObjectB(models.Model):  
    fk_myObjectA = models.ForeignKey(myObjectA, related_name="Blah_Blah") 
    field2 = models.CharField(max_length=255)

这是网址路径:

url(
    r'^api/myObjectA_Modify/(?P<myObjectA_ID>\d+)/?$', 
    myObjectA_Modify.as_view()
),

以下是通过添加新的myObjectB子记录来修改myObjectA实例的API视图:

class myObjectA_Modify(mixins.UpdateModelMixin, generics.GenericAPIView):
    queryset = myObjectA.objects.all()
    serializer_class = myObjectA_Serializer   

    def put(self, request, *args, **kwargs):

        retrieved_myObjectA = get_object_or_404(
            myObjectA, 
            pk=request.POST["myObjectA_ID"],
        )

        retrieved_myObjectA.modify()

        return Response(
            myObjectA_Serializer(retrieved_myObjectA.getBChildren()).data,
            status=status.HTTP_200_OK,
        )

对myObjectA_Modify的调用可以使用任意ID。我事先并不知道将使用哪个ID。 myObjectA可以有一个不确定数量的myObjectB子节点。此外,还有其他单独的API可返回所有myObjectAs和myObjectB的整个列表。

如何修改此应用程序代码以使用memcache?我的插入键应该是什么?我需要确保如果任何模型具有新插入或更新的子记录,则缓存中的父记录是更新。目前,一旦进入缓存,它就不会更新,因此网页会显示过时的信息。如果您可以向我显示上述代码段的实际代码更改,那将是最有帮助的。

1 个答案:

答案 0 :(得分:1)

一种相对简单的方法是将函数附加到模型的post_save信号,并在模型实例更新时使缓存无效。