gpt4 book ai didi

python - Django 检测不需要的更改

转载 作者:行者123 更新时间:2023-12-01 03:41:16 25 4
gpt4 key购买 nike

Django 1.10,py 3.5

这是我的类似枚举的类:

@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 deconstruct docs做的一切都是正确的但显然 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),
),
]

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

最佳答案

字典有任意顺序,因此您的元组也有任意顺序。特别是在 Python 3.3+ 上,顺序可能会改变,因为它使用 random hash seed 。因此,元组的顺序也不同,并且具有相同项但顺序不同的元组比较起来并不相等。 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()

关于python - Django 检测不需要的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com