如何在更新和获取有子模型实例的Django中使用memcache?
我有一个现成的Django应用程序,目前没有使用数据库缓存。我正在尝试使用memcached来提升性能,减少对数据库的频繁访问。
到目前为止,我已经在服务器上安装并运行了memcache,安装了pymclib和django-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一起使用?我的插入键应该是什么?我需要确保如果任何模型有新插入或更新的子记录,缓存中的父记录也会更新。目前,一旦某个数据进入缓存,它就不会再更新,因此网页显示的是过时的信息。如果你能给我展示上述代码片段的实际代码更改,那将非常有帮助。