我已经通过重命名其文件夹,导入及其所有引用(模板/索引)来更改Django中应用程序的名称.但是现在我尝试运行时遇到了这个错误python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Run Code Online (Sandbox Code Playgroud)
如何调试并解决此错误?有线索吗?
所以大约一年前,我开始了一个项目,像所有新开发人员一样,我并没有真正关注结构,但是现在我与Django一起开始显示我的项目布局主要是我的模型结构很糟糕.
我的模型主要存放在一个应用程序中,并且这些模型中的大多数应该在他们自己的个人应用程序中,我确实尝试解决这个并将它们移动到南方然而我发现它很棘手并且由于外键等而非常困难.
但是由于Django 1.7和内置的迁移支持,现在有更好的方法吗?
我正在将应用程序重命名为更合适的名称.在这样做时,我想确保South正确迁移数据库(重命名数据库表并更改django_content_type或south_migrationhistory中的引用).我知道如何将模型迁移到其他应用程序,但是当我尝试重命名应用程序本身时,South无法正确识别迁移历史记录.
不受欢迎的解决方案:在重命名时old_app,new_app我可以old_app/migrations完整保留并添加新的迁移到此目录以将数据库迁移到引用new_app.
如果可能的话我宁愿old_app完全删除目录.我还没有想过更好地解决这个问题.
使用Django South重命名应用程序而不丢失数据的最佳方法是什么?
我犯了一个愚蠢的错误,就是在同一个Django应用程序中创建太多模型,现在我想把它分成3个不同的模型.问题是:在两个客户的站点中已经有生产数据,所以我需要仔细规划任何模式/数据迁移(我正在使用django-south).我不确定如何继续,任何建议将不胜感激.
(我在Ubuntu服务器12.4 LTS上使用PostgreSQL,如果有任何相关性)
我考虑过使用db.rename_table,但是无法弄清楚如何正确地将外键更新为那些模型(从旧到新) - 在数据库级别无关紧要(因为表重命名已经覆盖了),但在ORM级别则不然.
更新:在考虑之后,在对programmmers.SE 提出这个问题后,我决定保持简单,不要担心产品主要版本之间的迁移.短期内,我将使用db.rename_table匹配新名称,同时也使用db_table丹尼尔罗斯曼建议,一直保持模型在旧的应用程序.当升级到主要版本时,我开始使用新应用程序并完全放弃所有迁移(因此,新版本的新安装将"按原样"创建数据库,而不是完成所有历史迁移).
我目前有一个需要重写的结构,以应对Django-CMS
目前的设置如下
class Video(models.Model):
#embed_code_or_url = models.CharField(max_length=2000)
permalink = models.URLField(verify_exists=True, unique=True, max_length=255, default="http://", validators=[validate_youtube_address])
thumbnail = models.CharField(max_length=500, blank=True, null=True)
# Data
title = models.CharField(max_length=255, blank=True)
...
class VideoPlugin(CMSPlugin):
video = models.ForeignKey(Video)
Run Code Online (Sandbox Code Playgroud)
当我现在将所有字段从中转移Video到VideoPlugin,运行我的模式移植时,我还想在运行迁移时将所有信息从Video传输到VideoPlugin.
有没有人有一个如何实现这一目标的例子?
这是要运行的迁移的开始
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'VideoPlugin.permalink'
db.add_column('cmsplugin_videoplugin', 'permalink', self.gf('django.db.models.fields.URLField')(default='http://', unique=True, max_length=255), keep_default=False)
# Adding field 'VideoPlugin.thumbnail'
db.add_column('cmsplugin_videoplugin', 'thumbnail', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True), keep_default=False)
# Adding field 'VideoPlugin.title'
db.add_column('cmsplugin_videoplugin', 'title', self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), keep_default=False)
...
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助
我试图从一个Django应用程序的几个模型迁移到另一个基于这个问题,我如何迁移模型出一个Django应用程序,进入一个新的?我已经有了很多工作但是在创建第一次迁移时我收到了这个错误:
"The model 'contenttype' from the app 'contenttypes' is not available in this migration."
Run Code Online (Sandbox Code Playgroud)
谷歌和SO似乎没有找到任何发生这种情况的案例,上述问题也没有任何具体的说法,除了代码中的评论:
if not db.dry_run:
# For permissions to work properly after migrating
orm['contenttypes.contenttype'].objects.filter(app_label='common', model='cat').update(app_label='specific')
Run Code Online (Sandbox Code Playgroud)
真的很感激任何洞察我做错了什么.
以下是两个迁移文件:
创建:
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
db.rename_table('cars_country', 'general_country')
if not db.dry_run:
# For permissions to work properly after migrating
orm['contenttypes.ContentType'].objects.filter(app_label='cars', model='country').update(app_label='general')
def backwards(self, orm):
pass
Run Code Online (Sandbox Code Playgroud)
删除:
# encoding: utf-8
import datetime …Run Code Online (Sandbox Code Playgroud) 我正在使用 django v2.0.2 构建一个项目,该项目由 3 个具有 24 个模型的应用程序组成。其中一款应用有 14 个模型。在一个应用程序中拥有如此多的模型变得越来越复杂,我想创建一个新应用程序并将少数模型移至此应用程序。
我找到了一个答案,解释了如何使用南来做到这一点。我一直在使用 django 核心迁移,由于不推荐使用南,此时我不想切换到南。
我想要移动的模型非常复杂 - 它们有ForeignKey字段、ManyToMany字段等。我需要一个工作流来展示如何使用 django 核心迁移来移动这些模型。