无法使用 Django 3.0.3 中的迁移 API 来使用 ModelState 和 ProjectState 进行迁移

2023-12-02

我正在使用 ProjectState 迁移到表的新属性。我试图了解 Django 3.0.3 中迁移 API 的 ModelState 和 ProjectState 使用。

我无法迁移到有新字段的新州。有人可以帮我吗ProjectState and ModelState使用什么来申请新的 model_definition 迁移才能工作?以下代码不会迁移到数据库,但不会给出任何错误。

我想从一个数据库表状态迁移到另一个状态并且有一些元数据_meta.

  • 当前数据库状态model_state.fields is:

    [('id', <django.db.models.fields.AutoField>)]

  • 未来的数据库状态model_state.fields添加后fields_attrs迁移应该是这样使用models_definition:

    [('id', <django.db.models.fields.AutoField>), ('name', <django.db.models.fields.CharField>)]

模型定义代码为:

model_config 对象是

{
 '__module__': 'testmodule', 'app_label': 'testmodule', 
 '__unicode__': <function ModelScript.model_create_config.<locals>.<lambda> at 0x00000221B6FBEF70>, 
 'attrs': {'name': <django.db.models.fields.CharField>}
}

model_definition 是:

model_definition = type(
                model_item.table_name,
                # TODO: Put this into Database
                # model_config.get("extends"),
                bases,
                model_config
            )

这是我正在使用的代码:

from django.db.migrations.state import ProjectState
from django.db.migrations.migration import Migration
from django.db.migrations.state import ModelState
from django.db.migrations import operations

# model_definition is coming from a function as the following object
model_definition = {'__module__': 'testmodule', 'app_label': 'testmodule', '__unicode__': <function ModelScript.model_create_config.<locals>.<lambda> at 0x000002047275FF70>, 'attrs': {'name': <django.db.models.fields.CharField>}, '__doc__': 'SampleModel(id)', '_meta': <Options for SampleModel>, 'DoesNotExist': <class 'testmodule.SampleModel.DoesNotExist'>, 'MultipleObjectsReturned': <class 'testmodule.SampleModel.MultipleObjectsReturned'>, 'id': <django.db.models.query_utils.DeferredAttribute object at 0x00000204727F9430>, 'objects': <django.db.models.manager.ManagerDescriptor object at 0x00000204727F9490>}

model_state = ModelState.from_model(model_definition)

# field_attrs are all the new fields to be migrated         
for k,v in field_attrs.items():
    model_state.fields.append((k, v))

# Create a fake migration with the CreateModel operation
cm = operations.CreateModel(name=model_state.name, fields=model_state.fields)

migration = Migration("fake_migration", model_state.app_label)
migration.operations.append(cm)

# SHOULD ProjectState be used for the new definition to be APPLIED to DB and HOW?
state = ProjectState()
with db_conn.schema_editor(collect_sql=True, atomic=migration.atomic) as schema_editor:
     # Following create_model also doesnot migrate to Mysql DB
     # Gives a Table exists Error even with root user of mysql
     # schema_editor.create_model(model_definition)

     # Following doesnot migrate to the new required state
     state = migration.apply(state, schema_editor, collect_sql=True)
     # Following gives atomic transaction error if used along with atomic
     # following commit commented gives no error but doesnt migrate
     # db_conn.commit()

我已阅读此内容并使用如何以编程方式为 Django 中的给定模型生成 CREATE TABLE SQL 语句?

欢迎对此提供任何帮助或资源。

更新:我确实尝试了 Django 的测试用例,但它无法以编程方式工作。我必须明确使用 addfield 吗?不确定如何让它发挥作用。 projectstate 和 model_create 方式都不起作用


首先,你need正在使用模型元类, ie. ModelBase, 并不是type:

from django.db.models.base import ModelBase

model_definition = ModelBase(
    model_item.table_name,
    bases,
    model_config
)

一旦你使用正确的元类,您可能会收到无数错误,因为您使用了许多类属性ModelBase在内部设置,并不期望您自己设置。

您不应转储模型具有的所有属性,而应仅设置以下属性:ModelBase期望以传统模式为背景,其中包括:

  • __module__ and __qualname__
  • 模型字段
  • 自定义管理器或查询集
  • 模型方法
  • model Meta

其他一切都应该被省略。

例如,如果您有一个如下所示的模型,则在模块中myapp.models:

class Parent(models.Model):
    name = models.CharField(max_length=45)

class Child(models.Model):
    name = models.CharField(max_length=45)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

class ModelWithMeta(models.Model):
    class Meta:
        db_table = 'some_table'

这些模型的动态版本需要如下所示:

from django.db import models
from django.db.models.base import ModelBase

bases = (models.Model,)

Parent = ModelBase('Parent', bases, {
    '__module__': 'myapp.models',
    '__qualname__': 'Parent',
    'name': models.CharField(max_length=45),
})

Child = ModelBase('Child', bases, {
    '__module__': 'myapp.models',
    '__qualname__': 'Child',
    'name': models.CharField(max_length=45),
    'parent': models.ForeignKey('myapp.Parent', on_delete=models.CASCADE),
})

ModelWithMeta = ModelBase('ModelWithMeta', bases, {
    '__module__': 'myapp.models',
    '__qualname__': 'ModelWithMeta',
    'Meta': type('Meta', (), {'db_table': 'some_table'}),
})

我不明白你的迁移代码的目的,所以我假设这是一个试图让动态模型工作的黑客,这意味着你可能可以完全扔掉它并使用内置的迁移加载器,即:

python3 manage.py makemigrations myapp && python3 manage.py migrate myapp

我你不熟悉Pythonmetaclasses,我建议阅读它们,因为这是理解我的代码的先决条件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Django 3.0.3 中的迁移 API 来使用 ModelState 和 ProjectState 进行迁移 的相关文章

  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • 使用会话在 Django 中将文件从一个视图传递到另一个视图

    我当前的工作项目要求我允许用户上传各种格式的文件 目前仅处理 CSV 格式 然后使用包含的数据来绘制图表Pandas http pandas pydata org 图书馆 我决定将图形渲染到模板的最简单方法是为图形创建特定视图 然后将图像从
  • Django - 在长时间处理期间显示加载消息

    我怎样才能显示请稍等从 django 视图加载消息 我有一个 Django 视图 需要花费大量时间对大型数据集执行计算 当进程加载时 我想向用户呈现一条反馈消息 例如 旋转加载动画 gif 或类似消息 在尝试了布兰登和穆拉特提出的两种不同方
  • 想要定制django Rest框架Browsable API页面

    问题 我想自定义 django Rest Framework Browsable API 页面 使其具有与我的 Web 应用程序的其余部分相同的外观和感觉 安装的软件 Python 3 6 Django 1 10 6 Django 休息框架
  • OperationFailure:在 MongoEngine/PyMongo 中线程化时出现数据库错误

    我有一个函数可以从网站读取数据 对其进行处理 然后将其加载到 MongoDB 中 当我在没有线程的情况下运行它时 它工作正常 但是一旦我设置了只调用这个函数的 celery 任务 我经常会收到以下错误 OperationFailure 数据
  • 将庞大数据库从亚马逊RDS导出到本地mysql

    我在 Amazon RDS 上有一个 mysql 数据库 大约 600GB 数据 我需要将其移回本地专用服务器 但我不知道从哪里开始 每次我尝试初始化 sqldump 时它都会冻结 有没有办法将其移至 S3 甚至可能在开始下载之前将其分成更
  • 404因为重新启动webpack-dev-server

    当我尝试更改反应组件并保存它以查看热加载器是否更新了我的页面时 我在开发人员工具中得到了这个 GET http localhost 3000 public bundle 76566a1ad7e45b834d4e hot update jso
  • Wagtail 自定义管理

    我是 Wagtail 和 Django 开发的新手 如何更改 Wagtail 管理页面的颜色 根据一些问答 我可以通过 core css 更改颜色 但是扫描代码需要很多时间 有一个更简单的方法 您可以注册 Wagtail Hook 在此处阅
  • Celery为每个任务实例安排了带有到期时间的任务?

    我有一个带有 celery 4 1 0 的 django 应用程序和带有数据库调度程序的 celerybeat 我想要的是从管理站点运行定期任务并为每个任务设置过期时间 expireperiodictask 中的属性是一个时间调度程序 停止
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • Django 之外的 Django 模型

    我有一个非 Django 项目 我想使用 Django 模型作为数据访问层 添加了模型库requirements txt django model utils 3 1 1 代码设置如下 from django conf import set
  • Django 1.11 我们可以在两个不同数据库的表之间创建关系吗?

    在我的项目中 我试图创建具有多个数据库的中央数据库服务 所以我的问题是我们可以在两个不同数据库的表之间创建关系吗 Example MySQL DB1 表用户 class User models Model name models CharF
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 如何在 Django 序列化器中使用主键

    我的模型是 class UserInfo models Model user models OneToOneField User unique True mobile no models CharField max length 10 bl
  • 如何使用 DJango Rest Framework 上传多个图像?

    我可以使用以下代码上传单个图像 如果我选择多个图像 则仅上传所选图像中的最后一个图像 模型 py class Image models Model property id models ForeignKey properties Addre
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • django Q 对象嵌套reduce

    得到非常复杂的查询 请不要尝试解决示例 问题更复杂 crit crit append Q firstcond name Q firstcond isnull True crit append Q secondcond name Q firs
  • 如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

    Django Rest 框架有一个主键相关字段 http www django rest framework org api guide relations primarykeyrelatedfield其中列出了我的 IDmany to m

随机推荐

  • 循环遍历某个范围内的每个工作簿

    我有一个工作簿 其中一列包含 Excel 工作簿文件路径和文件名 C D Folder1 File1 xls C D Folder2 File2 xls C D Folder3 File3 xls 每个文件及其文件路径都是从上面的目录中提取
  • 记录依赖树[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要记录 vb6 dotnet 应用程序中的程序集依赖项 哪些技术 工具适合执行此类文档 我本来打算使用 Visio 来绘图 作为开始 尝试依赖可
  • 初始化私有成员c#

    我有两个私有列表 需要在创建对象时初始化 第二个列表取决于第一个列表 我可以这样做吗 public class MyClass private List
  • Solr SuggestComponent 是否能够返回带状疱疹而不是整个字段值?

    我使用 solr 5 0 0 并希望创建一个自动完成功能 从我的文档的词元 或木瓦 中生成建议 问题是 作为建议查询的回报 我只能得到搜索字段的完整 术语 该术语可能非常长 当前问题 输入 否 建议 超长的文字so长文继续 下一篇长文so下
  • 阻止 Excel 自动将某些文本值转换为日期

    有谁知道是否有一个标记可以添加到我的 csv 中的某个字段 这样 Excel 就不会尝试将其转换为日期 我正在尝试从我的应用程序编写一个 csv 文件 其中一个值恰好看起来很像日期 Excel 会自动将其从文本转换为日期 我尝试将所有文 本
  • Pandas drop 函数在 for 循环中不起作用?

    全部 我对此感到非常困惑 并且我一生都无法找出错误 我试图遍历数据框中的所有字符串并删除不包含字符串 Barry Bonds 的字符串 到目前为止 我已经设法能够按索引删除行 bb db drop bb db index 1 这成功地删除了
  • 如何引用选定的散景数据点

    我创建了一个散景图 它使用圆形字形并具有 lasso select 工具 这是从 ipython 笔记本中运行的 当我查看该图 代表散点图 时 我选择显示为异常值的圆圈 是否有办法引用笔记本中选定的数据 我怀疑 source selecte
  • 使用 OAuth 的 Office 365 / EWS 身份验证

    我正在尝试使用 OAuth 和 EWS 托管 API 登录 Office 365 Exchange Online 我能够使用连接到 Office 365 Web API REST 因此我确实拥有来自 Active Directory 身份验
  • 如何使用app-route在polymer 3中实现路由

    我一直坚持在 Polymer 3 中实现路由 我遵循了应用程序路由文档 但是在加载网页时 我没有看到任何组件被加载 我签到了shadow DOM并且没有看到任何 DOM 被渲染 不知道我错过了什么 这是代码 static get prope
  • 配置 workitemhandler 在 JBPM 7 中发送电子邮件

    下面是当前我们必须在 JBPM 7 32 中发送电子邮件的工作项处理程序 但我们收到错误java lang RuntimeException Unable to send email new org jbpm process workite
  • 获取 window.onunload 事件中接下来打开的页面的 url

    有没有办法获取 window onunload 事件中接下来打开的页面的位置 此致 克沙夫 不 这将是一个安全问题 想象一下有人从色情网站导航到银行网站 反过来 使用 HTTP Referrer 标头 已经有些令人头疼了 Firefox 允
  • 自定义字体仅在 Interface Builder 中设置时可用

    我已将自定义字体添加到我的项目中 它包含在目标中 并添加到 plist 中 当我尝试以编程方式使用它时 它不起作用 并且当我打印出可用字体列表时它不会显示 但是 它确实在 Interface Builder 中显示为一个选项 如果我在 IB
  • Request.IsAuthenticated 始终返回 False

    我的 Request IsAuthenticated 遇到问题 总是返回 false 我正在设置 AuthCookie CurrentRequest currentRequest null if Url IsLocalUrl returnU
  • 通过准备好的语句设置RAW数据类型

    我的表中有一列列名称是 INSTANCE GUID 它的原始数据类型 我正在编写一个准备好的语句选择查询并设置 INSTANCE GUID pstatement setString instanceGuid 但这是设置原始数据类型的正确方法
  • 逐渐循环所有彩虹颜色的 div 背景颜色 | CSS

    如何随着时间的推移通过彩虹的所有颜色更改 div 的背景颜色 然后将其再次设置回其原始颜色并无限循环处理 下面的代码是我想要的结果 但只有一个 div 逐渐改变其颜色 div div rainbow background color blu
  • 如何将双引号中的内容与golang中的正则表达式匹配?

    content null Age 24 Balance 33 23 rule regexp Compile results rule FindAllString content 1 fmt Println results 0 Age fmt
  • Fedora 19 使用 rpmfussion 的 NVIDIA 驱动程序:libGL 错误:无法加载驱动程序:swrast

    在我的 Fedora 19 机器上运行使用 Qt 4 7 的应用程序时 我从应用程序中收到以下错误 libGL screen 0 does not appear to be DRI2 capable libGL OpenDriver try
  • 具有 DatabaseGenerateOption.Identity Guid Id 的 EF6 实体强制插入我的 Id 值

    我正在尝试使用 EF 导出 导入 DbContext 的现有数据库 在此上下文中 有多个实体具有 Guid Id 属性以及由 ModelBuilder 定义的 DatabaseGeneeratedOption Identity 当我重新导入
  • 读取Python中的最低有效位

    我必须在 Python 中解析系统日志消息的功能和严重性 这些值作为单个整数随每条消息一起提供 事件的严重性为 0 7 在整数的 3 个最低有效位中指定 从数字中评估这 3 位的最简单 最快的方法是什么 我现在的代码只是右移 3 位 然后将
  • 无法使用 Django 3.0.3 中的迁移 API 来使用 ModelState 和 ProjectState 进行迁移

    我正在使用 ProjectState 迁移到表的新属性 我试图了解 Django 3 0 3 中迁移 API 的 ModelState 和 ProjectState 使用 我无法迁移到有新字段的新州 有人可以帮我吗ProjectState