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中的objects.get和objects.filter方法的区别
python之django的objects.get和objects.filter方法