关于django makemigrations/migrate在生成数据表上遇到的一些问题

由于公司以前的项目采用的是通过sql文件迁移数据库的方法,虽然在后续接手工作的时候没什么不适,但是对于一个全新的项目来说,要重新手动生成数据库表实在太花时间了,还容易导致model与表结构不一致,故此特意认真学习使用migrate这个功能。

问题一:makemigrations并migrate后,发现有的model并没有生成数据表。重新makemigrations却提示No changes detected。

原因:

在对比了几个model在migrations上的区别以后发现

class Sys(models.Model):
    id = models.CharField(max_length=255, primary_key=True, unique=True)

    class Meta:
        managed = False
        db_table = 'sys'

问题出在"managed = False"上,由于按照以往项目的习惯,直接抄了下来,原来是不生成数据表的意思,去掉就好了。


问题二:手动把数据库的表删除后再migrate却提示 No migrations to apply.

原因:数据库里还有一个django-migrate表,把里面的相关数据也一并删了就可以了。


问题三:在设置了AUTH_USER_MODEL后产生的一系列奇怪的问题。

像是诸如明明已经在INSTALLED_APP里添加了app的名字后,并确认已经导入的情况下,仍然提示

ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'system.sysuser', but app 'system' isn't installed.

以及一些别的情况(忘了。。。)

解决方法:找到自己的/python3X/lib/site-packages/django/contrib/admin/migrations文件夹,把里面除了__init__.py的所有文件,全部删了再migrate就可以了。(注意,切勿把__init__.py文件删了,也不要把contrib/contenttypes这个文件夹下的migrations删了,不然会导致migrate功能失效,像我就只能把django卸了重下)

我自己想了一下,可能是因为在设置自定义用户模型之前,django已经默认了原来的user模型,导致后来再生成user表的时候冲突,不得不说,django把user模型的migrations文件放在自己的库里实在是太隐蔽了。


自此,migrate功能使用基本正常,另外还配套生成了一堆auth_xx的表,暂时不知道有什么用,倒也不影响使用,先放下了。

### Django 数据迁移过程 在 Django 中,数据迁移是一个重要的概念,用于同步模型定义与数据库结构。当接手一个新的 Django 项目时,在启动服务之前确实需要先进行数据迁移操作[^1]。 对于初次设置或更新现有项目的数据库模式而言,具体步骤如下: - **创建迁移文件** 使用 `makemigrations` 命令来检测模型的变化并生成相应的迁移脚本。 ```bash python3 manage.py makemigrations ``` - **应用迁移至数据库** 执行 `migrate` 来实际改变数据库架构以匹配当前的应用程序状态。 ```bash python3 manage.py migrate ``` 如果涉及到更换不同的数据库后端,则需确保已经在配置文件(如 `local_settings.py` 或者默认的 `settings.py`)里正确设置了新的数据库参数[^2]。 ### 向已存在的格内添加记录 一旦完成了上述的数据迁移流程之后,就可以考虑往这些已经建立好的里面加入一些初始数据或者是测试用例了。有两种主要的方式可以用来插入新纪录到数据库中的某个特定单中去[^3]。 #### 方法一:利用 save() 函数保存实例化后的对象 这是最基础也是最常见的做法之一。首先根据应用程序内的 Models 定义构建一个具体的类实例,接着调用其自带的方法 `.save()` 即可将其持久化存储于对应的数据之中。 ```python from myapp.models import MyModel new_entry = MyModel(field_name='value') new_entry.save() ``` #### 方法二:借助 objects.create() 此方式更为简洁高效,允许一次性完成对象初始化及其入库动作而无需显式声明变量名再单独调用一次 .save(). ```python from myapp.models import MyModel MyModel.objects.create(field_name='value') ``` 以上就是关于如何在 Django 应用当中实施数据迁移以及怎样向指定的数据表中追加条目的基本介绍。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值