Django 模型中的自定义 table 创建选项

Custom table creation options in django models

我有一个女模特(我是说 django =)

class Girl(models.Model):
  id = models.AutoField(primary_key=True)

  first_name = models.TextField()
  last_name = models.TextField()
  nickname = models.TextField(blank=True, null=True)
  maiden_name = models.TextField(blank=True, null=

  about = models.TextField(blank=True, null=True)
  quotes = models.TextField(blank=True, null=True)
  activities = models.TextField(blank=True, null=True)
  books = models.TextField(blank=True, null=True)
  games = models.TextField(blank=True, null=True)
  tv = models.TextField(blank=True, null=True)
  interests = models.TextField(blank=True, null=True)
  movies = models.TextField(blank=True, null=True)
  music = models.TextField(blank=True, null=True)
  ...
  class Meta:
    managed = True
    db_table = 'girls'

故事:数据库是 MariaDB+InnoDB,文本字段可能包含非常大的 unicode 诗歌。 所以我很快 运行 解决了这个问题 http://instantbadger.blogspot.ru/2013/01/mysql-row-size-too-large-when-saving.html

问题:在 MariDB 中,无法通过变量 (https://jira.mariadb.org/browse/MDEV-9646)

为所有表指定默认值 ROW_FORMAT

问题:如何在 Meta 或迁移文件本身中指定此选项以使 django 添加 "ROW_FORMAT=COMPRESSED" 到最终 SQL?

您可以像这样在迁移文件中添加自定义 SQL 迁移操作:

operations = [
    ...
    migrations.RunSQL(""" YOUR SQL HERE """)
]

因为 Django 无法按原样完成您想要的操作,但您可以手动向迁移中添加一行来更改 table,如上所示。

请注意,这会降低您的项目的灵活性:如果您决定迁移到不支持该操作的存储后端,那么您将需要重写迁移。此外,当您更改模型时,更改不会反映在手写 SQL 中,这可能会破坏某些东西。话虽如此,但有时很难绕过手写查询。

或者,您可以编写自己的 django 包,将此功能添加到模型的元数据中。这还需要编写自定义数据库后端,因为据我所知,不可能轻松地将自定义数据库操作添加到现有数据库后端。