我在恢复包含重命名表的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) 我们正在从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) 我正在尝试使用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
我正在尝试向我之前创建的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
我正在为我的项目进行某种重构,我依赖于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(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)
知道如何处理?
有没有办法自动指定YES作为默认选项
manage.py makemigrations myAPp and
manage.py migrate commands
Run Code Online (Sandbox Code Playgroud)
我在迁移时尝试了--noinput选项,但我认为它默认为NO而不是YES
我试图限制 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
我有一个带有很多过时迁移的 Django 应用程序。我想删除旧的迁移并重新开始。
该应用程序有 14 个不同的“迁移”文件夹。
以下是其中一些的样子:
从每个文件夹中删除所有内容是否安全?或者,我是否必须确保只删除一些文件——如果是这样,哪些文件?
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 ×10
python ×2
django-1.7 ×1
django-1.9 ×1
django-2.1 ×1
django-admin ×1
migration ×1
postgresql ×1
python-3.x ×1