Django filter().first()返回与get()不同的结果

2024-10-01 15:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何调试这个。我有这个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,
        null=True,
        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管理员会报告模型已成功更新,但当他们刷新页面时,数据仍然过期

我打开了一个Django外壳并调查:

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]: ''

我进一步尝试了执行queryset update(),得到了相同的结果

当我查看数据库时,它变得更奇怪了。事实证明,该值实际上已在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(Ubuntu11.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
        }
    }
}

Tags: djangointrueobjectsmodels管理员outcp

热门问题