标签: django-migrations

恢复自动生成的迁移以重命名Django中的表时出错

我在恢复包含重命名表的Django(1.8.7)迁移方面遇到了问题.即使它似乎能够在Postgres中重命名它,它然后尝试使用表名添加约束.

这是追溯:

    cursor.execute(sql, params)
  File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/utils/six.py", line 658, in reraise
    raise value.with_traceback(tb)
  File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "team_membershiprole" does not exist
Run Code Online (Sandbox Code Playgroud)

如果你看一下它生成的SQL,

[...]
ALTER TABLE "team_membershiprole" RENAME TO "team_leadershiprole";
[...]
ALTER TABLE "team_leadershipteammember" 
    ADD CONSTRAINT "team_l_role_id_xxx" 
    FOREIGN KEY ("role_id") REFERENCES "team_membershiprole" ("id") …
Run Code Online (Sandbox Code Playgroud)

python django django-migrations

11
推荐指数
1
解决办法
383
查看次数

Python 2 - > 3 Django迁移导致字段参数类型更改

我们正在从Django 1.8 - > 2.1和Python 2.7 - > 3.6过渡Django项目.

在旧项目版本中,有一些看起来像这样的Django模型,例如:

# models.py

from django.db import models

class RowStatusModel(models.Model):
    active = models.BooleanField(default=True, db_column='is_active')
    # ...
    class Meta:
        abstract = True
Run Code Online (Sandbox Code Playgroud)

请注意,from __future__ import unicode_literals不是这个模块中使用.这意味着它db_column是Python 2 str,与bytesPython 3 相对应.初始迁移0001_initial.py如下所示:

# 0001_initial.py

operations = [
    # ...
    ('row_ef', models.BooleanField(default=True, db_column=b'is_active')
    # ...
]
Run Code Online (Sandbox Code Playgroud)

请注意字节文字b'is_active,我想这是由Django完成的,为了更明确,但我不确定.

现在,在将大部分代码库转换为2to3并运行之后makemigrations,Python 3将字符串文字视为Python 2中的unicode类型,并因此db_column为每个继承自的模型生成一个字符串文字的迁移RowStatusModel:

# migrations/0023_auto_20180827_1955.py 
migrations.AlterField(
    # ...
    field=models.BooleanField(default=True, db_column='is_active')
), # …
Run Code Online (Sandbox Code Playgroud)

python django django-migrations

11
推荐指数
1
解决办法
849
查看次数

使用迁移为Django中的模型字段添加索引

我正在尝试使用Field.db_index具有迁移的应用程序在模型字段上添加索引.看看Django的文档我需要做的就是设置db_index=True:

class Person(models.Model):
    first_name = models.CharField()
    last_name = models.CharField(db_index=True)
Run Code Online (Sandbox Code Playgroud)

然后我首先尝试了新的Django迁移:

./manage.py makemigrations app-name
Run Code Online (Sandbox Code Playgroud)

但是迁移似乎没有注意到更改,也没有添加用于创建索引的sql命令.所以我试着django-admin.py按照这里的解释:

django-admin.py sqlindexes app-name
Run Code Online (Sandbox Code Playgroud)

但是,这也不会打印sql命令,它会退出并出现以下错误:

CommandError: App 'app-name' has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
Run Code Online (Sandbox Code Playgroud)

django django-models django-admin django-migrations django-2.1

10
推荐指数
3
解决办法
4980
查看次数

更改模型以添加"通过"关系以订购ManytoMany字段 - Django 1.7迁移修改

我正在尝试向我之前创建的ManyToMany字段添加订单.我基本上想订购图片集中的图片.我在Django 1.7上运行,所以没有更多的南迁移(我试图遵循这个教程:http://mounirmesselmeni.github.io/2013/07/28/migrate-django-manytomany-field-to-manytomany-through -with -南/)

这是我的"通过"关系:

class CollectionPictures(models.Model):
    picture = models.ForeignKey(
        Picture,
        verbose_name=u'Picture',
        help_text=u'Picture is included in this collection.',
    )
    collection = models.ForeignKey(
        Collection,
        verbose_name=u'Collection',
        help_text=u'Picture is included in this collection',
    )
    order = models.IntegerField(
        verbose_name=u'Order',
        help_text=u'What order to display this picture within the collection.',
        max_length=255
    )

    class Meta:
        verbose_name = u"Collection Picture"
        verbose_name_plural = u"Collection Pictures"
        ordering = ['order', ]

    def __unicode__(self):
        return self.picture.name + " is displayed in " + self.collection.name + (
        " in …
Run Code Online (Sandbox Code Playgroud)

migration django manytomanyfield django-1.7 django-migrations

10
推荐指数
2
解决办法
5593
查看次数

定义自定义post_migrate信号

我正在为我的项目进行某种重构,我依赖于django django.contrib.auth.models.Permission模型.到目前为止,我使用post_save信号为每个新用户定义权限,因此在创建用户时,我使用user.user_permissions.add(the_permission)它分配权限,这非常有效.

现在我想使用该django.contrib.auth.models.Group模型来区分用户应具有的权限.

这是我的代码:

from django.apps import AppConfig
from django.db.models.signals import post_migrate
from django.contrib.auth.models import Group, Permission


def create_group(name, permissions):
    group = Group.objects.create(name=name)
    [group.permissions.add(permission) for permission in permissions]


def define_company_groups(sender, **kwargs):
    permissions = [
        Permission.objects.get(codename='add_mymodel'),
        Permission.objects.get(codename='change_mymodel'),
    ]
    create_group('managers', permissions)


class MyAppConfig(AppConfig):
    name = 'players'
    verbose_name = 'The players app'

    def ready(self):
        post_migrate.connect(define_company_groups, sender=self)
Run Code Online (Sandbox Code Playgroud)

在定义了这段代码之后,我希望在调用之后./manage.py migrate应该触发这个处理程序.但它没有发生,我得到的只是:

Running post-migrate handlers for application players
Adding permission 'players | mymodel | Can add mymodel'
Adding permission 'companies …
Run Code Online (Sandbox Code Playgroud)

django django-signals django-migrations

10
推荐指数
2
解决办法
3995
查看次数

带有CORS转储数据的Django 1.9:"corsheaders_corsmodel"不存在

我正在使用跨站点引用开发Django(1.9)Rest后端和AngularJS前端.尝试执行./manage.py dumpdata命令时,会抛出以下异常:

$ python manage.py dumpdata -o dev/dumpdata.json
CommandError: Unable to serialize database: relation 
"corsheaders_corsmodel" does not exist
LINE 1: SELECT COUNT(*) AS "__count" FROM "corsheaders_corsmodel"
Run Code Online (Sandbox Code Playgroud)

知道如何处理?

django postgresql django-migrations django-1.9

10
推荐指数
1
解决办法
2131
查看次数

Django在提示符时自动迁移并makemigrate

有没有办法自动指定YES作为默认选项

manage.py makemigrations myAPp and
manage.py migrate commands
Run Code Online (Sandbox Code Playgroud)

我在迁移时尝试了--noinput选项,但我认为它默认为NO而不是YES

django django-migrations

10
推荐指数
2
解决办法
3540
查看次数

在 Model.Meta 中使用 CheckConstraint 和 Django GenericForeignKey 时出错 - 此查询中不允许加入字段引用

我试图限制 GFK 只指向几个模型的对象,我认为 CheckConstraint 将是一个很好的方法,但是我得到了这个错误

class ManualAdjustment(Model):
    content_type = models.ForeignKey(ContentType, null=True, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField(null=True)

    booking_obj = GenericForeignKey('content_type', 'object_id')  
    # should point to a app1.Booking1 or app2.Booking2 or app3.Booking3 only - trying to enforce this via CheckConstraint


    class Meta:
        constraints = [
            models.CheckConstraint(
                check=
                Q(content_type__app_label='app1', content_type__model='booking1') |
                Q(content_type__app_label='app2', content_type__model='booking2') |
                Q(content_type__app_label='app3', content_type__model='booking3'),
                name='myconstraint_only_certain_models'),
        ]

Run Code Online (Sandbox Code Playgroud)

我在迁移时出错

    execute_from_command_line(sys.argv)
  File "/Users/myuser/.virtualenvs/xenia371/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/myuser/.virtualenvs/xenia371/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/myuser/.virtualenvs/xenia371/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/myuser/.virtualenvs/xenia371/lib/python3.7/site-packages/django/core/management/commands/sqlmigrate.py", …
Run Code Online (Sandbox Code Playgroud)

django generic-foreign-key django-postgresql django-migrations django-generic-relations

10
推荐指数
1
解决办法
847
查看次数

Django:安全地移除旧的迁移?

我有一个带有很多过时迁移的 Django 应用程序。我想删除旧的迁移并重新开始。

该应用程序有 14 个不同的“迁移”文件夹。

以下是其中一些的样子:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

从每个文件夹中删除所有内容是否安全?或者,我是否必须确保只删除一些文件——如果是这样,哪些文件?

django django-models python-3.x django-migrations

9
推荐指数
2
解决办法
1万
查看次数

什么时候需要在 django `migrations.RunPython` 方法中使用 `schema_editor.connection.alias` ?

schema_editor.connection.alias什么时候需要在方法中使用它migrations.RunPython,为什么?

在数据迁移中使用 RunPython 时,django 建议您应该使用schema_editor.connection.alias

from django.db import migrations

def forwards_func(apps, schema_editor):
    # We get the model from the versioned app registry;
    # if we directly import it, it'll be the wrong version
    Country = apps.get_model("myapp", "Country")
    db_alias = schema_editor.connection.alias
    Country.objects.using(db_alias).bulk_create([
        Country(name="USA", code="us"),
        Country(name="France", code="fr"),
    ])

class Migration(migrations.Migration):

    dependencies = []

    operations = [
        migrations.RunPython(forwards_func, reverse_func),
    ]
Run Code Online (Sandbox Code Playgroud)

警告

RunPython不会神奇地为您改变模型的连接;您调用的任何模型方法都将转到默认数据库,除非您为它们提供当前数据库别名(可从 获得schema_editor.connection.alias,其中schema_editor是函数的第二个参数)。*

但是描述数据迁移的文档部分根本没有提到alias

from django.db import migrations …
Run Code Online (Sandbox Code Playgroud)

django django-migrations

9
推荐指数
0
解决办法
2378
查看次数