Django迁移和可拆解字符串

2024-04-25 08:13:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须创建一个实例必须满足两个条件的类:

  • str子类,以便可以将其传递给os.listdir()
  • 是可解构的,因此当django生成迁移时,字符串不会显示为原样,而是显示为mailing.conf.StrConfRef('another string')

以下是我尝试的:

class StrConfRef(str):

    def __new__(cls, name, within=None):
        value = globals()[name]
        if within:
            value = within.format(value)
        self = str.__new__(cls, value)
        self.name = name
        self.within = within
        return self

    def deconstruct(self):
        return ('{}.{}'.format(__name__, self.__class__.__name__), (self.name,),
                {'within': self.within})

第一点是尊重os.listdir(StrConfRef(...))作品。但是,在迁移中,它仍然被评估为“标准字符串”。我签出了django.db.migrations.autodetector,注意到当代码执行时,StrConfRef实例到达this line(这是预期的,应该意味着StrConfRef被正确地解构)。在

所以我想知道为什么它在我的迁移中显示为一个字符串,而不是一个邮寄.conf.StrConfRef实例。以及如何满足我的条件。在

PS:如果您想知道我为什么需要这种行为,请签出this question。在

PS2:我运行的是python3.4和Django 1.9.2


Tags: django实例字符串nameselfvalueosconf
1条回答
网友
1楼 · 发布于 2024-04-25 08:13:00

不幸的是,具有deconstruct()方法的对象没有strsubclasses的优先级。在

您可以在这里使用django.db.migrations.writer.SettingsReference类,它看起来比str具有优先权。在

我建议您改为创建一个自定义字段子类,它将默认为您的conf值。例如,Campaign.prefix_subject可以是此类的实例:

class PrefixSubject(models.BooleanField):
    default_help_text = (
        'Wheter to prefix the subject with "{}" or not.' % conf.SUBJECT_PREFIX
    )

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('help_text', default_help_text)
        super().__init__(*args, **kwargs)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        if kwargs['help_text'] == self.default_help_text:
            kwargs.pop('help_text')
        return name, path, args, kwargs

相关问题 更多 >