【问题标题】:In django does it matter where the `class Meta:` declaration is placed?在 django 中,“class Meta:”声明的放置位置是否重要?
【发布时间】:2012-08-30 13:38:52
【问题描述】:

按照惯例,django 将 class Meta: 声明放在类定义中的倒数第二个,就在 __unicode__ 方法定义之前。这是必需的吗?我试图在 Lion OSX 上追踪一个隐蔽的错误,其中 db_table = u'TableName' 语句的大小写(大写/小写)对于某些模型被忽略。对于某些模型manage.py syncdb 使用lower()ed 表名创建mysql 表,而对于其他模型,它正确使用db_table 大小写。更复杂的模型,自定义save()和其他方法是在创建mysql表之前转换为小写的模型。我正在尝试重新排列大量代码以查看是否是问题所在,但找不到正确顺序的文档,尽管我记得过去某处指定了 class Meta: 的位置。

还尝试了 db_table 规范的 unicode 文字和单字节字符串文字。 Niether 有所作为(对于工作或非工作模型)

以下是相关代码:

grep -A5 -B2 _table 'entityorganizer/models.py'

    class Meta:
        db_table     = 'Entity'
        verbose_name_plural = "entities"
        ordering = ["map_status","type_name","name"] 
        get_latest_by = "updated"

--

    class Meta:
        db_table = 'EntityRelationship'
        ordering = ["to_entity","relationship_type"]
        unique_together = (('from_entity','to_entity','relationship_type'))
        get_latest_by = "updated"
        verbose_name = "relationship"

--

    class Meta:
        db_table = 'Specialty'
        verbose_name_plural = u'specialties'

    def __unicode__(self):
        return '%s'%(self.specialty)

--

    class Meta:
        db_table = 'ZipCode'
        get_latest_by = "updated"

    def get_region(self):
        return REGION[region_id_v2-200][1] or 0

--

    class Meta:
        db_table = 'Setting'

    def __unicode__(self):
        return '%s = %s'%(self.name, self.value) #, self.updated)

【问题讨论】:

    标签: mysql django macos model meta


    【解决方案1】:

    您可以将 class Meta 放在模型中的任何位置,只要它与正确的缩进匹配即可。

    【讨论】:

    • 这就是我的假设。一定是我的模型 def 中存在其他错误,或者 Lion 和 MAMP 处理表名大小写的方式不一致。工作和非工作之间唯一重要的变化是在服务器上升级到 Lion OSX。
    • 尝试仔细检查您的标签?
    • 制表符/缩进很好。在 Linux 服务器上运行良好,但在 OSX Lion 上运行良好。
    • 如果您从 settings.py 中删除此特定应用程序,它是否有效?您确定代码与 osx + linux 机器同步吗?我只是在钓鱼。如果没有看到确切的设置/代码,很难判断。
    • 是的,所有其他应用程序(以及同一应用程序中的所有其他模型)都可以在 OSX 上正常运行。这就是为什么我被难住并问我关于 Meta 定义顺序的愚蠢问题。
    【解决方案2】:

    原来class Meta: 的位置确实是一个红鲱鱼(@sdolan 明确表示)。显然,MAMP 或 django 将有关已删除表的情况的元数据存储在表本身之外的某个地方。一旦我们删除了整个数据库并重新构建,db_table 案例被 mysql 和syncdb 兑现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 2010-10-22
      • 2020-06-30
      • 1970-01-01
      • 2011-09-05
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多