问题描述
我不知道如何调试这个。我有这个 Django 模型:
from django.db import models
from django.utils.translation import ugettext_lazy as _
# ...
class AbstractPhrase(models.Model):
term2_past_tense = models.TextField(_('term 2 past tense'))
# ... other simple fields and methods
class Meta:
abstract = True
class CommentPhrase(AbstractPhrase,models.Model):
"""A phrase that comprises part of a report card comment"""
skill = models.ForeignKey(Skill,null=True,on_delete=models.SET_NULL)
question = models.ForeignKey(
Question,on_delete=models.SET_NULL,related_name='phrases')
old_id = models.CharField(
_('old ID'),max_length=10,blank=True,null=True)
# ... Other simple fields
class Meta:
ordering = ('skill','question_number')
verbose_name = _('comment phrase')
verbose_name_plural = _('comment phrases')
管理员报告无法在 Django 管理中更新模型。保存后,Django admin 会报告模型更新成功,但是当他们刷新页面时,数据仍然过时。
我打开了一个 Django shell 并进行了调查:
In [3]: cp = CommentPhrase.objects.get(pk=10280)
In [4]: cp
Out[4]: <CommentPhrase: lorem ipsum>
In [5]: cp.term2_past_tense
Out[5]: ''
In [6]: cp.term2_past_tense = "Test"
In [7]: cp.save()
In [8]: cp.term2_past_tense
Out[8]: 'Test'
In [9]: cp.refresh_from_db()
In [10]: cp.term2_past_tense
Out[10]: ''
我进一步尝试执行查询集更新(),结果相同。
当我查看数据库时,它变得更奇怪了。事实证明,该值实际上已在 postgres shell 中成功更新。我可以使用以下语法查看更新后的值:
In [7]: CommentPhrase.objects.filter(pk=10280).first().term2_past_tense
Out[7]: 'Test'
但不是这样:
In [12]: CommentPhrase.objects.get(pk=10280).term2_past_tense
Out[12]: ''
计数返回 1:
In [2]: CommentPhrase.objects.filter(pk=10280).count()
Out[2]: 1
那么为什么 filter(pk=x).first() 会返回与 get(pk=x) 不同的东西???
我可以看到,在原始数据库上,值在那里,但它没有出现在 get 中,也没有出现在 Django 管理中。
多年来,数据库中有数百个实例通过导入和导出以及 Django 管理员进行维护和更新。它最近刚刚停止工作。我已经确认迁移是最新的并且在生产和本地之间保持一致,并且通过手动检查数据库架构看起来不错。
在我的本地机器上一切正常。该错误仅出现在生产中。我正在使用
- Python 3.9.0
- Django 3.1.3
- psycopg2-二进制 2.8.6
我的本地机器正在使用 psql (Postgresql) 12.6 (Ubuntu 12.6-0ubuntu0.20.04.1)(这里工作正常) 生产环境在 AWS RDS 上使用 psql(11.6(Ubuntu 11.6-1.pgdg18.04+1),服务器 10.15)
这是我的缓存配置:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache','LOCATION': '{0}/{1}'.format(env('REdis_URL',default='redis://127.0.0.1:6379'),0),'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient','IGnorE_EXCEPTIONS': True,# mimics memcache behavior.
# http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior
}
}
}
解决方法
已解决。我的 redis 缓存服务根本无法运行,我需要重新启动该服务。缓存基础设施工作后,一切都很好。