我想在django应用程序的每个模型中添加几个字段。这次是created_at
、updated_at
和{
在我的实例I中创建新的解决方案之前,重新排序我的实例中的元构造函数:
class MyModel(models.Model):
# Service fields
notes = my_fields.NotesField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
last_fields = ("notes", "created_at", "updated_at")
def __init__(self, *args, **kwargs):
new_order = [f.name for f in self._meta.fields]
for field in self.last_fields:
new_order.remove(field)
new_order.append(field)
self._meta._field_name_cache.sort(key=lambda x: new_order.index(x.name))
super(MyModel, self).__init__(*args, **kwargs)
class ModelA(MyModel):
field1 = models.CharField()
field2 = models.CharField()
#etc ...
它如期而至,但我在想,有没有更好的方法来实现我的目标?在
我也遇到了同样的问题,但我发现这些解决方案是有问题的,所以我做了如下工作:
对我来说,在管理中更改字段集比更改模型中的字段更有意义。在
我也不喜欢其他解决方案,所以我直接修改了迁移文件。在
每当在中创建新表时模型.py,您必须运行“python管理makemigrations”(我相信Django>;=v1.7.5)。完成此操作后,在your_app_path/migrations/目录中打开新创建的migrations文件,然后将行按您希望的顺序移动。然后运行“python管理迁移”。喂!通过进入“python”管理dbshell“您可以看到列的顺序正是您想要的!在
这种方法的缺点是:必须为创建的每个表手动执行此操作,但幸运的是,开销很小。这只能在创建新表时完成,而不是修改现有表。在
如果您主要需要Django的admin的排序,那么还可以通过对Django的admin类进行子类化来创建“generic”管理类。请参阅http://docs.djangoproject.com/en/dev/intro/tutorial02/#customize-the-admin-form以自定义管理中字段的显示。 您可以根据需要在创建管理实例时覆盖管理员的
__init__
来设置字段/字段集。E、 g.你可以做一些类似的事情:除此之外,我认为修改(private)
_field_name_cache
不是一个好的做法!在相关问题 更多 >
编程相关推荐