这是这个问题的扩展:如何在两个 Django 应用程序之间移动模型 (Django 1.7)
我想使用 Django 迁移将模型 M 从应用程序 A 移动到应用程序 B,而不丢失数据。该问题的最佳投票答案(不是已接受的答案,而是ozan的答案)建议使用 migrations.SeparateDatabaseAndState 并分两步进行:
这对我来说看起来是一个非常聪明的方法,但是在我的例子中,有另一个模型 N 具有 M 的外键。现在,当我在第二步中调用 makemigrations 来制作迁移文件时,我收到一个错误,因为在那个阶段AM 模型已不复存在:
ValueError: Lookup failed for model referenced by field C.N.m: A.M
Run Code Online (Sandbox Code Playgroud)
有办法处理这个问题吗?
我试图在迁移中创建自定义权限,但是运行 migrate 后,权限表中未创建该权限。有人能指出错误是什么吗?另外,我不确定应该使用什么作为 ContentType 的相关模型,因为该权限用于限制可以查看显示网站上用户摘要的页面的用户。任何帮助将不胜感激,谢谢。
def add_view_aggregated_data_permissions(apps, schema_editor):
ContentType = apps.get_model('django', 'ContentType')
Permission = apps.get_model('auth', 'Permission')
content_type = ContentType.objects.get(app_label='auth', model='user')
permission = Permission.objects.create(codename='can_view_data',
name='Can view data',
content_type=content_type)
Run Code Online (Sandbox Code Playgroud) 我更改了模型类上的一个字段(没有类指向它,只有一个外键指向它)。不知何故,这塞满了我的迁移,并且一直显示“django.db.migrations.graph.NodeNotFoundError:”寻找不存在的迁移文件。
我不小心删除了“迁移”文件夹中的几个文件。
我的数据库包含大量数据,我不想破坏它。
如果我执行以下操作,我会丢失任何数据吗:
删除首先导致问题的表(psql、\d、DROP TABLE 表名)
删除我所有的迁移文件
从头开始重新运行迁移?
./manage.py makemigrations
./manage.py 迁移
谁能推荐另一种方法来解决这个问题?
这是回溯: http: //dpaste.com/0Y1YDXS
我有一个问题,我在模型中做了一些更改,因为我有一个整数字段必须更改为ForeignKey
derived_to对于错误,我将值 1分配给字段中的所有对象。
我现在想将此列中的所有行标记为空。我怎样才能做到这一点?这是我最后两次迁移
class Migration(migrations.Migration):
dependencies = [
('work_order', '0026_auto_20170603_1517'),
]
operations = [
migrations.AlterModelOptions(
name='workorder',
options={'verbose_name': 'work order', 'verbose_name_plural': 'work orders'},
),
migrations.AlterField(
model_name='workorder',
name='derived_to',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='store.OutsourceOption', verbose_name='outsource'),
preserve_default=False,
),
]
Run Code Online (Sandbox Code Playgroud)
还有最后一张
class Migration(migrations.Migration):
dependencies = [
('work_order', '0027_auto_20170605_0836'),
]
operations = [
migrations.AlterField(
model_name='workorder',
name='derived_to',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='store.OutsourceOption', verbose_name='outsource'),
),
]
Run Code Online (Sandbox Code Playgroud)
好吧,这就是我需要进行新的迁移以将 null 分配给列中 work_order 中的所有对象derived_to,因为现在所有对象都derived_to指向 OutsourceOptions 上的第一个寄存器,这是不正确的。
谢谢并为我糟糕的英语感到抱歉。
我正在尝试卸载名为 的应用程序django-cities,但在我的应用程序“位置”中,我有一个名为 的模型Venue,在迁移中该0001_initial.py模型的ForeingKeytocities.Subregion模型为django-cities。
我继续删除django-cities,INSTALLED_APPS但出现以下错误:
Traceback (most recent call last):
File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 128, in inner_run
self.check_migrations()
File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/core/management/base.py", line 422, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 20, in __init__
self.loader = MigrationLoader(self.connection)
File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 52, in __init__
self.build_graph()
File "/home/d/.virtualenvs/beplay/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 274, in build_graph
raise exc
django.db.migrations.exceptions.NodeNotFoundError: Migration places.0001_initial dependencies reference nonexistent parent …Run Code Online (Sandbox Code Playgroud) 新的迁移(添加一个简单的表)在迁移过程中给出错误“无法添加外键约束”。
这是一个现有的模型,称为EventLog:
class EventLog(models.Model):
"""
The event log.
"""
user = models.ForeignKey(User, blank=True, null=True)
timestamp = models.DateTimeField(auto_now=True)
text = models.TextField(blank=True, null=True)
ip = models.CharField(max_length=15)
metadata = JSONField(default={},blank=True)
product = models.TextField(default=None,blank=True, null=True)
type = models.ForeignKey(EventType)
def __unicode__(self):
return "[%-15s]-[%s] %s (%s)" % (self.type, self.timestamp, self.text, self.user)
def highlite(self):
if self.type.highlite:
return self.type.highlitecss
return False
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试创建的新模型:
class EventLogDetail(models.Model):
# NOTE: I've already tried switching 'EventLog' out for just EventLog.
eventlog = models.ForeignKey('EventLog', related_name='details')
order = models.IntegerField(default=0)
line = models.CharField(max_length=500)
class …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 django 中将外键转换为 GenericForeignKey。我计划在三个迁移中执行此操作:mig1、mig2、mig3。
迁移1(mig1)有以下代码
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
('post_service', '0008_auto_20180802_1112'),
]
operations = [
migrations.AddField(
model_name='comment',
name='content_type',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
),
migrations.AddField(
model_name='comment',
name='object_id',
field=models.PositiveIntegerField(null=True),
),
]
Run Code Online (Sandbox Code Playgroud)
迁移2(mig2)有以下代码
def change_posts_to_generic_key_comment(apps, schema_editor):
Comment = apps.get_model('post_service', 'Comment')
db_alias = schema_editor.connection.alias
comments = Comment.objects.using(db_alias).all()
for comment in comments:
Comment.objects.filter(id=comment.id).update(content_object=comment.post)
def reverse_change_posts_to_generic_key_comment(apps, schema_editor):
Comment = apps.get_model('post_service', 'Comment')
db_alias = schema_editor.connection.alias
comments = Comment.objects.using(db_alias).all()
for comment in comments:
Comment.objects.filter(id=comment.id).update(content_object=)
class Migration(migrations.Migration):
dependencies = [
('post_service', '0009_auto_20180802_1623'),
]
operations = [
migrations.RunPython(change_posts_to_generic_key_comment, …Run Code Online (Sandbox Code Playgroud) 我有一个现有的填充数据库,并且想将 a 转换PositiveIntegerField为FloatField. 我正在考虑简单地进行迁移:
migrations.AlterField(
model_name='mymodel',
name='field_to_convert',
field=models.FloatField(
blank=True,
help_text='my helpful text',
null=True),
),
Run Code Online (Sandbox Code Playgroud)
该字段当前定义为:
field_to_convert = models.PositiveIntegerField(
null=True,
blank=True,
help_text='my helpful text')
Run Code Online (Sandbox Code Playgroud)
这是否需要完全重写数据库列?对于更大的数据库来说,这种转换的扩展效果如何?如果绝大多数值都是 的话,它会如何扩展null?什么情况下这种转换会失败?如果有区别的话,这是由 Postgres 数据库支持的。
我RunPython在迁移中进行了操作,例如其中一项迁移:
class DataMigration(migrations.Migration):
dependencies = [('app1', '0001_initial')]
operations = [
migrations.RunPython(create_data, delete_data, elidable=True),
]
Run Code Online (Sandbox Code Playgroud)
此操作接受一个可选参数,该参数在Django 文档elidable中进行了描述:
可选的 Elidable 参数确定在压缩迁移时是否删除(消除)该操作。
这个描述让我有点困惑。elidable=True我的问题是:当带标志的迁移被压制时会发生什么?
我想迁移 withelidable=True会被简单地删除。并且必须采取一些手动步骤才能将删除的迁移逻辑添加到压缩的迁移逻辑中。
我有这样的迁移:
class Migration(migrations.Migration):
dependencies = [
('app', '0020_auto_20191023_2245'),
]
operations = [
migrations.AddField(
model_name='agenda',
name='theme',
field=models.PositiveIntegerField(default=1),
),
]
Run Code Online (Sandbox Code Playgroud)
但它会引发一个错误:
django.db.utils.ProgrammingError: column "theme" of relation "app_agenda" already exists
Run Code Online (Sandbox Code Playgroud)
没问题,我已经像这样包装了这个错误:
from django.db import migrations, models, ProgrammingError
def add_field_theme_to_agenda(apps, schema_editor):
try:
migrations.AddField(
model_name='agenda',
name='theme',
field=models.PositiveIntegerField(default=1),
),
except ProgrammingError as e: # sometimes it can exist
if "already exists" not in str(e):
raise
class Migration(migrations.Migration):
dependencies = [
('app', '0020_auto_20191023_2245'),
]
operations = [
migrations.RunPython(add_field_theme_to_agenda),
]
Run Code Online (Sandbox Code Playgroud)
这就像一个魅力,所有以下迁移都已完成。
我的问题是,每次我运行“ makemigrations”时,Django都会再次添加迁移(=我的问题顶部的迁移)。我想这是因为它在迁移中没有看到它,因为我的代码混淆了它。
如何使用迁移来规避此问题(不要说“这个问题出在您的数据库上,请更正您的数据库”之类的答案)?