Django中的显式列顺序

0 投票
1 回答
728 浏览
提问于 2025-04-18 12:25

我有一个模型,它关联了一个抽象的基类,像这样:

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)

不幸的是,之前负责这个项目的工程师没有考虑到要把删除的模式抽象出来,所以在Foo类中,is_deleted字段是在bar之后明确声明的。因此,代码和数据库中的列顺序不一致。有没有办法在不放弃我的抽象的情况下,让它们重新一致起来?

1 个回答

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 列表有任何变化,这些缓存就需要失效,这样才能重新生成。

撰写回答