我想知道什么是使用Django迁移删除所删除应用程序的所有表的最简洁方法.例如,如果我安装了一个新软件包,我将应用程序添加到我的settings.py中,然后执行manage.py makemigrations和manage.py migrate; 当我决定我不想使用这个包并将其从我的settings.py中删除时,命令manage.py makemigrations将告诉我"未检测到任何更改",因此manage.py migrate将无能为力,但我需要删除此删除的应用程序创建的表.
我期望Django迁移处理这个,所以如果我删除一个应用程序,它也会创建迁移以删除所有必要的表.
在Django 1.8项目中,当有以下代码时,我的迁移工作正常:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
from django.conf import settings
def update_site_forward(apps, schema_editor):
"""Add group osmaxx."""
Group = apps.get_model("auth", "Group")
Group.objects.create(name=settings.OSMAXX_FRONTEND_USER_GROUP)
def update_site_backward(apps, schema_editor):
"""Revert add group osmaxx."""
Group = apps.get_model("auth", "Group")
Group.objects.get(name=settings.OSMAXX_FRONTEND_USER_GROUP).delete()
class Migration(migrations.Migration):
dependencies = [
('auth', '0001_initial'),
]
operations = [
migrations.RunPython(update_site_forward, update_site_backward),
]
Run Code Online (Sandbox Code Playgroud)
此组是在迁移中创建的,因为它应在Web应用程序的所有安装中可用.为了使它更有用,我还想给它一个默认权限,所以我改为update_site_forward:
def update_site_forward(apps, schema_editor):
"""Add group osmaxx."""
Group = apps.get_model("auth", "Group")
Permission = apps.get_model("auth", "Permission")
ContentType = apps.get_model("contenttypes", "ContentType")
ExtractionOrder …Run Code Online (Sandbox Code Playgroud) 我不知道是什么导致了这个错误.它似乎是一个没有修复的错误.任何人都可以告诉我如何解决这个问题吗?令我感到沮丧的是,我永无止境.谢谢.
Operations to perform:
Apply all migrations: admin, contenttypes, optilab, auth, sessions
Running migrations:
Rendering model states... DONE
Applying optilab.0006_auto_20160621_1640...Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 353, in execute_from_command_line
utility.execute()
File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 345, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 348, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python27\lib\site-packages\django\core\management\base.py", line 399, in execute
output = self.handle(*args, **options)
File "C:\Python27\lib\site-packages\django\core\management\commands\migrate.py", line 200, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "C:\Python27\lib\site-packages\django\db\migrations\executor.py", line 92, in migrate
self._migrate_all_forwards(plan, …Run Code Online (Sandbox Code Playgroud) Django 1.7提及类的文档RunSQL可用于在表上创建部分索引.我有一个表,我想的组合title,blog和category是唯一的.但是,如果未提供类别,则标题和博客的组合仍应是唯一的.
class Post(models.Model):
title = models.CharField(max_length=200)
blog = models.ForeignKey(Blog)
category = models.ForeignKey(Category, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
我可以使用部分索引实现此约束(如下面显示的SQL).如果我使用Django 1.7迁移,我在哪里添加此代码?
CREATE UNIQUE INDEX idx1
ON Post (title, blog_id, category_id)
WHERE category_id IS NOT NULL;
CREATE UNIQUE INDEX idx2
ON Post (title, blog_id)
WHERE category_id IS NULL;
Run Code Online (Sandbox Code Playgroud) django django-models django-orm django-1.7 django-migrations
我最近在我的应用程序(UserProfile)中添加了一个模型,当我将更改推送到Heroku时,我想我不小心跑了heroku run python manage.py makemigrations.现在,当我尝试运行时,heroku run python manage.py migrate我得到以下错误
(leaguemaster) benjamins-mbp-2:leaguemaster Ben$ heroku run python manage.py migrate
Running `python manage.py migrate` attached to terminal... up, run.1357
Operations to perform:
Synchronize unmigrated apps: allauth
Apply all migrations: auth, admin, socialaccount, sites, accounts, account, contenttypes, sessions, leagueapp
Synchronizing apps without migrations:
Creating tables...
Installing custom SQL...
Installing indexes...
Running migrations:
No migrations to apply.
Your models have changes that are not yet reflected in a migration, and so …Run Code Online (Sandbox Code Playgroud) 我正在将我的网站从SQLite后端迁移到Postgres后端.我们从项目开始就一直在运行本地Django样式迁移(即不是南方).大多数迁移运行良好,但我们的应用程序中有一个打嗝.
我们在Postgres迁移中得到了这么多.(所有其他应用程序都已完全迁移.)所有迁移都在SQLite3上运行.
processes
[X] 0001_initial
[X] 0002_auto_20150508_2149
[ ] 0003_auto_20150511_1543
[ ] 0004_auto_20150528_1739
[ ] 0005_process_upstream
[ ] 0006_auto_20150605_1436
[ ] 0007_auto_20150605_1706
[ ] 0008_milestone_prevailing_process
Run Code Online (Sandbox Code Playgroud)
这两次迁移正确运行:
0001_initial.py:
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='DateReason',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(unique=True, max_length=50)),
('active', models.BooleanField(default=True)),
('final', models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name='EventType',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(unique=True, max_length=50)),
('active', models.BooleanField(default=True)),
],
),
migrations.CreateModel(
name='Metric',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(unique=True, max_length=50)),
('active', …Run Code Online (Sandbox Code Playgroud) 这是我正在尝试做的事情:在Django中创建一个PostgreSQL数组(数据库特定类型)的模型,它包含另一个模型的外键.
class Books(models.Model):
authors = ArrayField(
models.ForeignKey('my_app.Authors', default=None, null=True, blank=True),
blank=True,
default=list()
)
Run Code Online (Sandbox Code Playgroud)
当我尝试makemigrations时,Django给了我这个错误:
SystemCheckError:系统检查发现了一些问题:
错误:
my_app.Books.authors:(postgres.E002)数组的基本字段不能是相关字段.
关于如何击败的任何想法?
django postgresql django-models django-orm django-migrations
首先,我们有一个应用程序,其中有一些模型代表我们的票务支持系统Kayako的模型.此应用程序不应该知道有关使用它的其他应用程序的任何信息,并且应尽可能保持通用.由于此应用程序使用Kayako的现有表,因此我们将它运行在同一个数据库中.我们称这个应用程序kayakodb.
一个应用程序将客户数据库中的客户链接到票证支持系统中的票证.以前,这个系统有自己的票证支持系统内的票证表示,使用提供的API查询票证kayakodb.然后,它使用此票证表示将客户和域链接到.然而,这太复杂而且不太符合逻辑.因此,我们选择将其切换为代理模型,并将表示客户和域链接的模型移动到kayakodb.我们称这个应用程序sidebar.
另一个新的应用程序显示来自票务支持系统的票据,并在电话中清晰地显示,因此我们的支持部门可以轻松查看哪些电话和票证与哪些客户相关.该系统具有代理模型的代理模型sidebar,因为sidebar该应用程序还需要该模型提供的某些功能以及新代理模型声明的其他一些功能.我们称之为这个项目WOW.
在sidebar和WOW应用程序是相同的项目/库的两个组成部分.我们将此存储库称为Coneybeach具有自己的数据库.但是,这kayakodb是一个完全不相关的项目.它Coneybeach通过我们安装的需求文件包含在内pip.
kayakodb这当然是不行的.任何时候我们安装它的新版本kayakodb都会覆盖此迁移.更不用说kayakodb不应该知道哪些模型使用它的事实.
Ticket里面
的模型kayakodb:
class Ticket(models.Model):
"""
This model is a representation of the data stored in the "kayako" database table "swtickets". Minus a lot of stuff
we don't use. If you add a field make sure it …Run Code Online (Sandbox Code Playgroud) 我跑了python manage.py makemigrations,我得到:没有检测到任何变化然后,python manage.py migrate我得到:没有适用的迁移.
然后,我尝试将更改推送到生产:git push heroku master一切都是最新的
然后,在生产中,我重复命令:heroku run python manage.py migrate不应用任何迁移.
为了以防万一,我makemigrations在生产中运行:
heroku run python manage.py makemigrations
No changes detected
Run Code Online (Sandbox Code Playgroud)
为什么我得到一个
ProgrammingError at ....
column .... does not exist
Run Code Online (Sandbox Code Playgroud)
"未检测到任何更改"表示数据库与代码一致.我该怎么调试呢?
我有一个现有的模型,看起来有点像下面的......
class Resource(models.Model):
id = models.AutoField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)
我们已经使用它有一段时间了,现在Resource我们的数据库中有大约 1M 个这些对象的实例(以及相关的foreignkey/else 用法)。
我现在需要跟踪该模型上的另一个 ID,我想要强制执行的 ID 是唯一的。
other_id = models.IntegerField(unique=True)
Run Code Online (Sandbox Code Playgroud)
此other_id信息当前存储在一些外部 CSV 中,我想(在此过程中的某个时刻)将此信息加载到所有现有Resource实例中。
添加上述字段后,Django 的makemigrations工作正常。但是,当我针对现有数据库应用所述迁移时,我收到一条错误,指示我需要提供默认值以用于所有现有Resource实例。相信很多人都见过类似的事情。
解决此限制的最佳方法是什么?我想到的一些方法...
unique=True要求other_id到所有现有模型(通过某些管理命令或 1-off 脚本)unique=True回来并应用迁移other_id值other_id在运行时自动引用这些外部 CSV 来加载值manage.py migrate。如果(在将来的某个时刻)有人重新运行这些迁移并且这部分失败(无法id在 CSV 中找到现有资源来提取other_id),这可能会遇到问题。所有这些感觉都很复杂,但我想我想做的也不是最简单的事情。
有任何想法吗?我不得不想象过去有人必须解决类似的问题。
谢谢!
python django database-migration python-3.x django-migrations
django ×10
python ×4
django-1.7 ×2
django-orm ×2
postgresql ×2
heroku ×1
python-3.x ×1
sqlite ×1