Ошибка в Django CacheMachine игнорирует сохранение модели?
У меня очень простой класс 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 makemigrations
а также manage.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, показанные здесь. Они все прошли.
2 ответа
Я только что проверил свою вилку на машине с Windows, которую я сам сейчас проверял:
Проверка изображения: http://oi61.tinypic.com/2w5jf9d.jpg
URL Github: https://github.com/asketsus/django-cache-machine
Вы уверены, что запускаете этот тест на моей ветке? Это была проблема, которая у меня была (похожая) и была с ней решена.
Каждое сохранение должно аннулировать все наборы запросов, связанные с моделью. Так что в этом случае после x.save() объект MyClass не должен иметь никакой информации в вашем кэше.
Я протестировал и отлично работает в моем случае, используя Redis в качестве nocache db.