Django检测到不需要的更改

吉诺克

django 1.10,py 3.5

这是我类似Enum的课程:

@deconstructible
class EnumType(object):
    @classmethod
    def choices(cls):
        attrs = [i for i in cls.__dict__.keys() if i[:1] != '_' and i.isupper()]
        return tuple((cls.__dict__[attr], cls.__dict__[attr]) for attr in attrs)

    def __eq__(self, other):
        return self.choices() == other.choices()

这是该类的一个示例:

class TransmissionType(EnumType):
    TRANSMISSION_PROGRAM = 'TRANSMISSION_PROGRAM'
    INFO_PROGRAM = 'INFO_PROGRAM'
    SPORT_PROGRAM = 'SPORT_PROGRAM'

这是我在模型上使用它的方式:

type = models.TextField(choices=TransmissionType.choices(), db_index=True, default=None)

我认为我根据当前的django解构文档正确地完成了所有工作,但显然makemigration脚本仍会像这样每次创建迁移:

operations = [
    migrations.AlterField(
        model_name='transmission',
        name='type',
        field=models.TextField(choices=[('TRANSMISSION_PROGRAM', 'TRANSMISSION_PROGRAM'), ('INFO_PROGRAM', 'INFO_PROGRAM'), ('SPORT_PROGRAM', 'SPORT_PROGRAM')], db_index=True, default=None),
    ),
]

Edit1:预期行为-当类成员不更改时,生成的迁移不应包含AlterField

n

字典具有任意顺序,因此您的元组也具有任意顺序。特别是在Python 3.3+上,顺序可能会更改,因为它使用了随机的哈希种子因此,元组的顺序也不同,具有相同项目但不同顺序的元组比较起来并不相等。Django检测到此更改并创建新的迁移。

要解决此问题,只需在构造元组之前对键进行排序:

@deconstructible
class EnumType(object):
    @classmethod
    def choices(cls):
        attrs = [i for i in cls.__dict__.keys() if i[:1] != '_' and i.isupper()]
        return tuple((cls.__dict__[attr], cls.__dict__[attr]) for attr in sorted(attrs))

    def __eq__(self, other):
        return self.choices() == other.choices()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章