问题描述
|
在本地,我将sqllite3用作数据库,但在生产中,我使用MysqL。当我将项目移至生产环境时,遇到此错误:
...
File \"S:\\Python27\\lib\\site-packages\\django\\templatetags\\i18n.py\",line 46,in
render
langs = self.languages.resolve(context)
File \"S:\\Python27\\lib\\site-packages\\django\\template\\base.py\",line 653,in res
olve
value = self._resolve_lookup(context)
File \"S:\\Python27\\lib\\site-packages\\django\\template\\base.py\",line 692,in _re
solve_lookup
raise VariableDoesNotExist(\"Failed lookup for key [%s] in %r\",(bit,current
)) # missing attribute
VariableDoesNotExist: Failed lookup for key [LANGUAGES] in u\'[{},{},{}]\'
我正在使用django的i18n
关于这来自哪里的任何想法? Google并没有提供太多信息,对于调试而言,哪些数据对您有用呢?我将本地测试环境指向生产数据库,并遇到了相同的错误。
我在settings.py中的LANGUAGES变量是:
LANGUAGES = (
(\'en\',gettext(\'English\')),(\'fr\',gettext(\'french\')),)
编辑
打开调试后,我得到以下错误:
Caught OperationalError while rendering: (1242,\'Subquery returns more than 1 row\')
在线{% for f in frames %}
我的相框模型是:
@I18n(\'title\',\'description\')
class Collection(models.Model):
title = models.CharField(max_length=255)
description = models.CharField(max_length=255)
order = models.IntegerField(default=100)
image = models.ImageField(upload_to=\"collection/images\",null=True)
rollover = models.ImageField(upload_to=\"collection/images\",null=True,blank=True)
publish = models.BooleanField(default=True)
def __unicode__(self):
return self.title
@I18n(\'title\')
class Frame(models.Model):
title = models.CharField(max_length=255)
collection = models.ManyToManyField(Collection)
order = models.IntegerField(default=100)
image = models.ImageField(upload_to=\"frame/images\")
rollover = models.ImageField(upload_to=\"frame/images\",blank=True)
publish = models.BooleanField(default=True)
def __unicode__(self):
return self.title
编辑#2
麻烦的MysqL行,在sqlite中不会失败
SELECT `FrontEnd_article`.`id`,`FrontEnd_article`.`title_fr`,`FrontEnd_article`
.`title_en`,`FrontEnd_article`.`text_fr`,`FrontEnd_article`.`text_en`,`FrontEnd_article`.`date`,`FrontEnd_article`.`image`,`FrontEnd_article`.`image_text`,`FrontEnd_article`.`can_comment`,`FrontEnd_article`.`order`,`FrontEnd_article`.`publish` FROM `FrontEnd_article` INNER JOIN
`FrontEnd_article_frames` ON (`FrontEnd_article`.`id` =
`FrontEnd_article_frames`.`article_id`) WHERE `FrontEnd_article_frames`.`frame_id` =
(SELECT U0.`id` FROM `FrontEnd_frame` U0 INNER JOIN `FrontEnd_frame_collection` U1 ON
(U0.`id` = U1.`frame_id`) WHERE (U1.`collection_id` = 1 AND U0.`publish` = True ))
ORDER BY `FrontEnd_article`.`date` DESC
再次感谢您的帮助!
解决方法
如果临时启用DEBUG,回溯是否相同?错误消息被禁用时可能会误导您。这也可能是错误的数据库设置,而Django则处于另一个阶段。
,
SELECT * FROM FrontEnd_article INNER JOIN FrontEnd_article_frames ON
(FrontEnd_article.id = FrontEnd_article_frames.article_id) WHERE
FrontEnd_article_frames.frame_id = (SELECT U0.id FROM FrontEnd_frame U0 INNER JOIN
FrontEnd_frame_collection U1 ON (U0.id = U1.frame_id) WHERE (U1.collection_id = 1 AND
U0.publish = True ))
这是Django生成的简化版本。当我分解此查询时,我意识到内部联接假定仅从以下位置返回1个值:
(SELECT U0.id FROM FrontEnd_frame U0 INNER JOIN FrontEnd_frame_collection U1 ON
(U0.id = U1.frame_id) WHERE (U1.collection_id = 1 AND U0.publish = True ))
实际上返回了结果数据集。一旦找到修复程序,它就很简单,我用\“ IN \”替换了\“ = \”,并且可以正常工作。
FrontEnd_article_frames.frame_id IN (SELECT U0.id FROM FrontEnd_frame U0 INNER JOIN
FrontEnd_frame_collection U1 ON (U0.id = U1.frame_id) WHERE (U1.collection_id = 1 AND
U0.publish = True ))