如何在更新和获取有子模型实例的Django中使用memcache?

0 投票
1 回答
754 浏览
提问于 2025-04-18 08:48

我有一个现成的Django应用程序,目前没有使用数据库缓存。我正在尝试使用memcached来提升性能,减少对数据库的频繁访问。

到目前为止,我已经在服务器上安装并运行了memcache,安装了pymclibdjango-memcache-admin,并按照我在这里描述的内容修改了settings.py文件。不过,我还没有修改任何实际的应用代码。但当我查看django-memcache-admin的仪表板时,仍然可以看到缓存正在生效。缓存的效果也很明显,因为当我加载某些视图时,显示的数据是过时的。也就是说,更新的数据没有进入缓存。我需要一些建议来解决这个问题。下面有更详细的说明。

这是我的模型:

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()
),

这是一个API视图,它通过添加一个新的myObjectB子记录来修改myObjectA的实例:

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可以返回所有myObjectA和myObjectB的完整列表。

我该如何修改这个应用代码以便与memcache一起使用?我的插入键应该是什么?我需要确保如果任何模型有新插入或更新的子记录,缓存中的父记录也会更新。目前,一旦某个数据进入缓存,它就不会再更新,因此网页显示的是过时的信息。如果你能给我展示上述代码片段的实际代码更改,那将非常有帮助。

1 个回答

1

一种比较简单的方法是把一个函数连接到模型的 post_save 信号上,当模型的实例被更新时,就让缓存失效。

撰写回答