python - Django 迁移和可定制的可重用应用程序

标签 python django django-migrations django-apps

大约 3 周前我开始编写我的第一个可重用应用程序,但我在处理迁移方面遇到了麻烦。

我希望我的应用程序的某些点可以自定义。因此我有一个 conf submodule定义自定义设置并分配适合大多数情况的合理默认值。

这导致我的一些模型字段看起来像这样:

attachment = models.FilePathField(
    path=conf.ATTACHMENTS_DIR, recursive=True)

template_file = models.FileField(
    upload_to=conf.TEMPLATES_UPLOAD_DIR, blank=True)

prefix_subject = models.BooleanField(
    default=True, verbose_name=_("prefix subject"),
    help_text=_(
        "Whether to prefix the subject with \"{}\" or not."
    ).format(conf.SUBJECT_PREFIX))

不幸的是,在使用此应用程序的项目中,这会导致 django-admin makemigrations 在每次设置更改时为其创建迁移。甚至,他们第一次安装应用程序时的设置默认值取决于主机系统。

我非常怀疑在他的应用程序副本中创建自己的迁移的项目的合法性。但如果我错了,请告诉我。

对于上面示例中的prefix_subject,我用 this solution 解决了这个问题.考虑到在迁移中丢失 help_text 信息不是很有效。

但是,我不确定这是适合所有/大多数情况的解决方案。是吗?

我想到了另一个似乎有效的解决方案。此解决方案是手动编辑迁移并用变量本身替换评估的设置。

例如,我会替换这个:

migrations.CreateModel(
    name='MailStaticAttachment',
    fields=[
        ('id', ...),
        ('filename', ...)
        ('mime_type', ...)
        ('attachment', models.FilePathField(path='/home/antoine/Workspace/django-mailing/static/mailing/attachments', recursive=True, verbose_name='file')),
    ],
    options={...}
),

与:

from ..conf import ATTACHMENTS_DIR

migrations.CreateModel(
    name='MailStaticAttachment',
    fields=[
        ('id', ...),
        ('filename', ...)
        ('mime_type', ...)
        ('attachment', models.FilePathField(path=ATTACHMENTS_DIR, recursive=True, verbose_name='file')),
    ],
    options={...}
),

您觉得这是个不错的解决方案吗?

在这种情况下你建议怎么办?

我认为 Field.help_textFilePathField.pathFileField.upload_to 属性都不用于创建 SQL 语句。所以在这种情况下,应该不会因为“在迁移中忽略它们”而出现具体问题。但是,假设我想要一个可自定义的 Field.defaultField.db_columnCharField.max_length 怎么办?这可能是一个没有实际意义的非常糟糕的想法,但这是我能找到的唯一假设情况。 :P 我想在这种情况下最好提供一个抽象的基础模型,旨在由宿主项目进行扩展。

最佳答案

django.db.migration 的设计过程中,决定跟踪所有字段属性,即使它们不影响它们的模式表示。

对于upload_to 的情况,我建议您简单地传递一个在模块级别定义的函数 as documented .

import os

def upload_to(instance, filename):
    return os.path.join([conf.TEMPLATES_UPLOAD_DIR, filename])

对于 pathhelp_text 我建议您使用类似于我对 django-sundial 所做的方法提供可配置的默认值。你只需要确保你传递了一个带有 deconstruct() method returning the appropriate parameters 的类的实例。 .

from django.utils.six import python_2_unicode_compatible


@python_2_unicode_compatible
class StringConfReference(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return getattr(conf, self.name)

    def deconstruct(self):
        return "%s.%s" % (__name__, self.__class__.__name__), (self.name,), {}


attachment = models.FilePathField(
    path=StringConfReference('ATTACHMENT_DIR'), recursive=True
)

关于python - Django 迁移和可定制的可重用应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35485498/

相关文章:

django-models - 为什么在创建数据迁移时使用 apps.get_model()?

python - 将 python 脚本及其生成的进程的输出通过管道传输到 Linux 中的文本文件

python - ufunc bitwise_xor 的类型错误

python - Django,属性错误: 'module' object has no attribute

django - 在 Django 1.7c2 中运行迁移时出现循环依赖错误

Django没有这样的表: django_site after deleting migrations and database

Python - 来自 RabbitMQ Consumer 的异步多处理

python - Django:使用 render_to_response 并设置 cookie

django - 使用多个数据库时运行 makemigrations

python - auto_now_add 字段覆盖我的输入