我有一个带有相关抽象基类的模型,如下所示:
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
}。因此,代码和数据库在列顺序上不一致。在没有放弃抽象的情况下,有什么方法可以让他们重新达成协议?
答案 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
字段,但这当然可以是列表中的任何位置。
最后一步很重要,因为fields
和get_field
等依赖于_field_cache
,_field_name_cache
和_name_map
中的缓存条目。如果local_fields
列表以任何方式更改,这些应该无效,因此可以重新生成它们。