【问题标题】:Bug in Django CacheMachine ignores saving of Model?Django CacheMachine 中的错误忽略模型的保存?
【发布时间】:2015-04-04 20:54:19
【问题描述】:

我有一个非常简单的 Django 类:

from django.db import models

class MyClass(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()

    def __str__(self):
        return "MyClass #%s: a: %s, b %s" % (self.pk, self.a, self.b)

当我执行 CRUD 类型的操作时,这个类可以正常工作:

>>> from statistics.models import MyClass
>>> print MyClass.objects.all()
[]
>>> x = MyClass(a=6, b=10)
>>> print MyClass.objects.all()
[]
>>> print x
MyClass #None: a: 6, b 10
>>> x.save()
>>> print MyClass.objects.all()
[<MyClass: MyClass #2: a: 6, b 10>]
>>>

现在我在类定义中添加/修改 3 行以启用 CacheMachine:

from caching.base import CachingManager, CachingMixin  # This line added
from django.db import models

class MyClass(CachingMixin, models.Model):             # Added a Mix-in
    a = models.IntegerField()
    b = models.IntegerField()
    objects = CachingManager()                         # This line added

    def __str__(self):
        return "MyClass #%s: a: %s, b %s" % (self.pk, self.a, self.b)

manage.py makemigrationsmanage.py migrate 之后,我截断数据库,刷新 memcached 并运行我之前运行的相同实验。

但是那个实验失败了!保存新创建的 MyClass 实例后,查询数据库显示它不存在。为什么?如何解决这个问题?有没有其他人看过这个?

>>> print MyClass.objects.all()
[]
>>> x = MyClass(a=6, b=10)
>>> print MyClass.objects.all()
[]
>>> print x
MyClass #None: a: 6, b 10
>>> x.save()
>>> print MyClass.objects.all()
[]

仅供参考,我对 Django Cache Machine 进行了测试,显示为 here。他们都通过了。

【问题讨论】:

  • 看起来它可能与 django-cache-machine 中的这个打开的错误相同:github.com/jbalogh/django-cache-machine/issues/62
  • 哇。这是一个非常大的错误,没有得到解决。它使整个 DjangoCacheMachine 几乎毫无用处。你知道是否有已知的解决方法吗?
  • 我对缓存机器一无所知,我是在搜索 github 问题跟踪器后才发现的。我鼓励您将错误报告发布到 github 存储库,其中包含详细信息,以帮助贡献者重现该问题。这是一种简单而有意义的回馈方式,可能有助于在即将发布的版本中解决此问题。

标签: python django django-orm django-cache-machine


【解决方案1】:

我刚刚在一台 Windows 机器上测试了我的 fork,现在我自己检查一下:

图片检查:http://oi61.tinypic.com/2w5jf9d.jpg

Github 网址:https://github.com/asketsus/django-cache-machine

【讨论】:

  • 是的。谢谢!!我运行了pip install -e git://github.com/asketsus/django-cache-machine.git#egg=django-cache-machine,现在似乎一切正常除了当我尝试运行pip -r requirements.txt时出现以下错误:gist.github.com/syedsaqibali/03bbccd39adad31ee222。任何想法为什么?
  • @SaqibAli:我也遇到过这个问题。我通过手动将#egg=some-repo-name 添加到requirements.txt 中的相关行来解决它。 pip freeze 没有为我这样做,但是 pip install 不会接受没有 #egg= 的 github 地址
  • @SaqibAli:您的 requirements.txt 链接需要 google 文档权限才能访问。为此,我建议改用 gist.github.com
  • 谢谢你,Haken,我会试试这个,很快就会向你报告。您无法访问 Google 文档链接吗?这是一个图像(这就是我没有使用 gist 的原因)。它的权限是公开的。所以大家应该都能看到。我刚刚在 Chrome 中通过隐身模式再次对其进行了测试。它对我有用。顺便说一句,some-repo-name 可以是任何字符串吗?如果没有,请告诉我您使用的确切值。
  • 解决方案是在 requirements.txt 中删除以下行末尾的/HEAD-e git://github.com/asketsus/django-cache-machine.git@a26b302e119b469b94b0683b067755beaf678675#egg=django_cache_machine-origin/HEAD
【解决方案2】:

您确定要针对我的分支运行此测试吗?这是我遇到的问题(类似的)并已解决。

每次保存都应使与模型相关的所有查询集无效。所以在这种情况下,在 x.save() 之后,对象 MyClass 不应该在您的缓存中包含任何信息。

在我的情况下,我已经测试并且工作正常,使用 Redis 作为 nocache db。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多