如何在Django 1.8+上重新运行数据迁移?如果相关,我的迁移编号为0011_my_data_migration.py,是最新的迁移.
django如何知道迁移是否已经应用?它通常是正确的,但如果它没有,我不知道从哪里开始故障排除.
我有两个应用程序(ook并且eek说),我想ook从模型中使用外键到模型eek.两者都是在INSTALLED_APPS与ook第一位.
在ook.models.py,我有:
class Fubar(models.Model):
...
Run Code Online (Sandbox Code Playgroud)
在eek.models.py,我有:
class monkey(models.Model):
external = models.ForeignKey('ook.Fubar', blank=True, null=True)
...
Run Code Online (Sandbox Code Playgroud)
生成的迁移是:
class Migration(migrations.Migration):
dependencies = [
('eek', '0002_auto_20151029_1040'),
]
operations = [
migrations.AlterField(
model_name='monkey',
name='external',
field=models.ForeignKey(blank=True, to='ook.Fubar', null=True),
),
]
Run Code Online (Sandbox Code Playgroud)
当我运行迁移时,我收到此错误:
...
1595 raise ValueError('Foreign Object from and to fields must be
the same non-zero length')
1596 if isinstance(self.rel.to, six.string_types):
-> 1597 raise ValueError('Related model %r cannot be resolved' % …Run Code Online (Sandbox Code Playgroud) (我知道有一个与此相同的标题,但问题不同).
我设法使我的开发机器迁移和生产迁移不同步.
我有一个使用South的Django应用程序.我有自己的工作流程,工作正常(这可能不是正确的做事方式,但我没有遇到任何问题).
基本上我有一个脚本将生产数据库转储复制到我的开发机器.它还复制了迁移文件.这样两者是同步的,我可以照常运行南方命令.
现在我已升级到1.7,并开始使用迁移.当我使用以前的工作流程(复制数据库转储和生产中的迁移文件)时,它不会检测我的开发计算机上的更改.
我已经阅读了迁移文档,我发现使用它的正确方法是
无论如何.现在一切都搞得一团糟.我想"重置"我的迁移并从头开始,从现在开始做正确的事情.
我需要做什么?
我错过了什么吗?是否有理由为什么从生产(数据库和迁移文件)复制所有内容后,我的开发机器上都没有检测到任何更改
在Django中,是否有一种简单的方法可以检查是否已运行所有数据库迁移?我发现manage.py migrate --list,它给了我想要的信息,但格式不是机器可读的.
对于上下文:我有一个脚本,在迁移数据库之前不应该开始运行.由于各种原因,从正在运行迁移的进程发送信号会很棘手.所以我想让我的脚本定期检查数据库以查看是否所有迁移都已运行.
我刚刚将我的应用程序升级到1.7(实际上还在尝试).
这就是我在models.py中所拥有的:
def path_and_rename(path):
def wrapper(instance, filename):
ext = filename.split('.')[-1]
# set filename as random string
filename = '{}.{}'.format(uuid4().hex, ext)
# return the whole path to the file
return os.path.join(path, filename)
return wrapper
class UserProfile(AbstractUser):
#...
avatar = models.ImageField(upload_to=path_and_rename("avatars/"),
null=True, blank=True,
default="avatars/none/default.png",
height_field="image_height",
width_field="image_width")
Run Code Online (Sandbox Code Playgroud)
当我尝试时makemigrations,它抛出:
ValueError: Could not find function wrapper in webapp.models.
Please note that due to Python 2 limitations, you cannot serialize unbound method functions (e.g. a method declared
and used in the same class body). …Run Code Online (Sandbox Code Playgroud) 在Django的迁移代码中,有一个squashmigrations命令:" 如果可能的话,将迁移压缩到更少的迁移,app_label包括migration_name更少的迁移."
所以,如果你想压缩前五次迁移,这将有所帮助.
从一个特定的壁球开始压制的最佳方法是migration_name什么?
在我目前正在开展的项目中,我们添加了5-10个新的迁移文件,因为我们添加了新功能.我们将立即部署整个项目,看起来单独运行这些将花费太长时间.我想将此项目的所有迁移压缩为单个迁移并测试运行时间.
我正在使用该contribute_to_class方法,但我不知道如何使用新的迁移在数据库中创建字段.
我在1.7版本上观察到了这种行为,但在以前的版本中没有使用南迁移.
例如.
class RedemptionCode(models.Model):
EXPIRE_OPTIONS = (
('1 week', '1 Week'),
)
expire_option = models.CharField(max_length=255, choices=EXPIRE_OPTIONS)
Run Code Online (Sandbox Code Playgroud)
当我添加更多选项时:
EXPIRE_OPTIONS = (
('1 week', '1 Week'),
('2 weeks', '2 Weeks'),
('1 month', '1 Month'),
('1 day', '1 Day'),
)
Run Code Online (Sandbox Code Playgroud)
并运行makemigrations,它为它创建一个迁移,来自south后台我认为应该说没有检测到任何变化,因为它不会影响数据库模式.我不知道它的用途是什么:
class Migration(migrations.Migration):
dependencies = [
('credits', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='redemptioncode',
name='expire_option',
field=models.CharField(max_length=255, choices=[('1 week', '1 Week'), ('2 weeks', '2 Weeks'), ('1 month', '1 Month'), ('1 day', '1 Day')]),
),
]
Run Code Online (Sandbox Code Playgroud) 我试图在Django 1.7上的数据迁移期间使用admin.LogEntry对象
该'django.contrib.admin'应用程序已列出INSTALLED_APPS.
在shell上,它的工作原理是:
>>> from django.apps import apps
>>> apps.get_model('admin', 'LogEntry')
django.contrib.admin.models.LogEntry
Run Code Online (Sandbox Code Playgroud)
但在迁移过程中,它失败了:
def do_it(apps, schema_editor):
LogEntry = apps.get_model('admin', 'LogEntry')
Run Code Online (Sandbox Code Playgroud)
失败如下:
django-admin migrate
(...)
LookupError: No installed app with label 'admin'.
Run Code Online (Sandbox Code Playgroud)
使用调试器,我得到了'admin'没有安装:
ipdb> apps.get_apps()
[]
ipdb> apps.all_models.keys()
['website', 'google', 'allauth', 'twitter', 'busca', 'conteudo', 'django_mobile', 'django_filters', 'videocenter', 'tinymce', 'oferta', 'programacaotv', 'contenttypes', 'suit', 'haystack', 'destaque', 'filer', 'galeria', 'auth', 'facebook', 'paintstore', 'critica', 'disqus', 'fichas', 'omeletop', 'autocomplete_light', 'modelsv1', 'temas', 'django_extensions', 'adv_cache_tag', 'taggit', 'social', 'personalidade']
Run Code Online (Sandbox Code Playgroud)
为什么??