Django中的显式列顺序
我有一个模型,它关联了一个抽象的基类,像这样:
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
字段),不过你可以把它放在列表中的任何位置。
最后的步骤很重要,因为 fields
和 get_field
等是依赖于 _field_cache
、_field_name_cache
和 _name_map
中缓存的内容。如果 local_fields
列表有任何变化,这些缓存就需要失效,这样才能重新生成。