Django错误仅在MySQL数据库上

问题描述

| 在本地,我将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 ))