在使用Django开发时,默认迁移生成的表名是app + model的组合名,但这往往不是我们想要的结果,所以需要自定义去修改默认生成的表名

本实例使用Django3.2.8,下面使用两种方式去修改它

自定义db_table属性

该方式是最简单的方法,也是官方推荐的方法

代码如下:

class Person(models.Model):
    id = models.BigAutoField(primary_key=True, verbose_name="ID")
    name = models.CharField(max_length=64, verbose_name="姓名", db_column='person_name')
    objects = models.Manager()
    class Meta:
        db_table = 'person'

当然我觉得这种方法比较笨

自定义元类

通过创建模型类的自定义元类,更改内部元类的 db_table 属性
其中name是model类名,可以使用驼峰转下划线去定义,更符合命名标准

代码如下:

class ModelCustomName(ModelBase):
    def __new__(mcs, name, bases, attrs, **kwargs):
        table_name = f't_da_{name}'
        if not attrs.get('Meta', None):
            attrs['Meta'] = type("Meta", (), dict(db_table=table_name))
        abstract = getattr(attrs["Meta"], 'abstract', False)
        if not hasattr(attrs["Meta"], 'db_table') and not abstract:
            setattr(attrs['Meta'], 'db_table', table_name)
        return super().__new__(mcs, name, bases, attrs, **kwargs)
class BaseModel(models.Model, metaclass=ModelCustomName):
    id = models.BigAutoField(primary_key=True, verbose_name="ID")
    objects = models.Manager()
    class Meta:
        abstract = True

然后继承BaseModel就行

代码如下:

class Person(BaseModel):
    name = models.CharField(max_length=64, verbose_name="姓名", db_column='person_name')

是不是感觉方便了很多
当然如果你觉得有些命名需要改一下

class Person(BaseModel):
    name = models.CharField(max_length=64, verbose_name="姓名", db_column='person_name')
    class Meta:
        db_table = 'person'

这样也是可以的

该文 如有缺陷及不足的地方,欢迎大家提出并纠正
class redis_data(models.Model): class Meta: db_table='redis_data' key=models.CharField(max_length=128) value=models.CharField(max_length=128) 转载于:https://www.cnblogs.com/biboxie/p/...
首先,利用django内置的分页功能,写分页类: from django.core.paginator import Paginator, Page # 导入django分页模块 class PageInfo(object): def __init__(self, current_page, all_count, base_url, per_page
在利用django连接数据库开发时,django 自动生成的表名是 app 名和 model 名的组合,但这往往不是我们想要的,自定义 db_table 属性就行了 class Student(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=...
Django中的数据表命名: 应用名小写_模型类名小写 这就造成一旦应用名发生了改变后,数据表的名字就会发生改变 所以在django中可以指定表明,无论应用名发生什么改变都不会影响数据表的命名 这称之为元选项 : 只需要在模型类中定义一个元类Meta,在里面添加属性db_table就可以指定表名。 # 创建书籍类 class Book(models.Model)...
问题描述,在admin界面中,管理表时希望将表名显示为中文,或者为自己希望的名字 如图,图中的所有表名,均为创建时的名字末尾再加s的形式,在这里我希望变成中文,例如tags 显示为“标签” 解决方法: 在models.py中对应的类下,添加 class Tag(models.Model): class Meta: #末尾不加s verbose...
2 ip_address = models.CharField(max_length=16) 4 #host = models.ForeignKey(Host) 注意此行,添加的是外键查询 6 n...
可以使用 Django 的迁移工具来修改数据库表字段。首先,在 models.py 文件中修改对应的字段,然后运行以下命令: python manage.py makemigrations 这将生成一个迁移文件,描述了如何修改数据库表。接下来,运行以下命令: python manage.py migrate 这将应用迁移文件,修改数据库表字段。注意,如果已经有数据在该表中,修改字段可能会导致数据丢失或无法转换,因此请谨慎操作。