Django中的显式列顺序

时间:2014-07-07 21:24:58

标签: python django django-models

我有一个带有相关抽象基类的模型,如下所示:

class UndeletableModel(models.Model):
    class Meta:
        abstract = True

    is_deleted = models.BooleanField(default=False)

    def delete(self, *args, **kargs):
        self.is_deleted = True
        self.save()

class Foo(UndeletableModel):
    bar = CharField(max_length=255)

不幸的是,该项目的前任工程师没有必要先瞻性地抽象出这种删除模式,因此is_deleted字段在Foo类后明确声明bar }。因此,代码和数据库在列顺序上不一致。在没有放弃抽象的情况下,有什么方法可以让他们重新达成协议?

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码在模型声明后运行:

field = Foo._meta.get_field('is_deleted')
Foo._meta.local_fields.remove(field)
Foo._meta.local_fields.insert(2, field)
if hasattr(Foo._meta, '_field_cache'):
    del Foo._meta._field_cache
    del Foo._meta._field_name_cache
if hasattr(Foo._meta, '_name_map'):
    del Foo._meta._name_map

这将在第二个字段(第一个是is_deleted字段)之后插入id字段,但这当然可以是列表中的任何位置。

最后一步很重要,因为fieldsget_field等依赖于_field_cache_field_name_cache_name_map中的缓存条目。如果local_fields列表以任何方式更改,这些应该无效,因此可以重新生成它们。