Django Models .get 失败,但 .filter 和 .all 有效 - 对象存在于数据库中

Posted

技术标签:

【中文标题】Django Models .get 失败,但 .filter 和 .all 有效 - 对象存在于数据库中【英文标题】:Django Models .get fails but .filter and .all works - object exists in database 【发布时间】:2012-11-10 10:43:48 【问题描述】:

为此绞尽脑汁。该模型似乎是正确的,理论上所有注释的排列都应该起作用——但唯一可以成功检索用户的是 .filter 和 .all; .get 不起作用;我可以处理使用 .filter 或 .all ---- 但为什么不工作?

我将重申,在这种情况下,直接 SQL 查询 100% 有效。所有导入都已到位,并且在低级别上运行良好 - 再次,过滤器工作,所有工作,但由于某种原因获取失败。

class UserModelTest(TestCase):
def test_getUserByUsername(self):
    sanity = True
    try:
        #u = User.objects.filter(username='wadewilliams')
        u = User.objects.get(username='wadewilliams')
        #u = User.objects.get(pk=15773)
        #u = User.objects.all()
    print u
    except User.DoesNotExist:
        sanity = False

    self.assertEqual(sanity, True)

...除非我取消注释过滤器或全部...否则该测试失败。

还有模特……

class User(models.Model):
    userid = models.IntegerField(primary_key=True, db_column='userID')
    username = models.CharField(max_length=135)
    realname = models.CharField(max_length=150, db_column='name')
    email = models.CharField(max_length=765, blank=True)

class Meta:
    db_table = u'users'

def __unicode__(self):
    return self.username + ' (' + self.email + ')'

【问题讨论】:

您可以在问题中添加堆栈跟踪吗?您收到的确切错误消息是什么? 我创建了一个视图来尝试为您提供堆栈跟踪。我创建了 url 路径并触摸了视图。它完美地运行。然后我重新运行了我的单元测试......他们通过了!!!我不确定为什么简单地触摸视图就可以解决单元测试?太奇怪了。谢谢你的帮助;对此的任何额外解释都非常感谢。 认为这可能是 unittest 模块的一些奇怪之处? 好吧,我错了。我省略了测试断言。当我重新添加它时,测试失败了,但视图似乎仍然可以正常工作。这是单元测试回溯........ FAIL: test_getUserByUsername (forge.tests.users_test.UserModelTest) ------------------ -------------------------------------------------- -- Traceback(最近一次调用最后一次):文件“/media/sf_host/checkouts/33/localmotors/localmotors/forge/tests/users_test.py”,第 72 行,在 test_getUserByUsername self.assertEqual(sanity, True) AssertionError: False != 真 【参考方案1】:

测试套件创建了一个空白的模拟数据库,因此即使生产/开发数据库中存在用户也找不到任何用户。

来自文档: 运行测试时从生产数据库中查找数据? 如果您的代码在编译其模块时尝试访问数据库,这将在设置测试数据库之前发生,可能会出现意外结果。例如,如果您在模块级代码中有一个数据库查询,并且存在一个真实的数据库,那么生产数据可能会污染您的测试。无论如何,在您的代码中包含此类导入时数据库查询是一个坏主意 - 重写您的代码,使其不会这样做。

【讨论】:

以上是关于Django Models .get 失败,但 .filter 和 .all 有效 - 对象存在于数据库中的主要内容,如果未能解决你的问题,请参考以下文章

媒体文件失败 Django

Django - 如何指定验证失败的字段?

django中的objects.get和objects.filter方法的区别

python之django的objects.get和objects.filter方法

python之django的objects.get和objects.filter方法

Django loaddata 对于 unicode 失败