django-reversion是否适用于南迁?
django-reversion和南方兼容吗?
当前版本:
- 回归 - 1.2.1
- 南 - 0.7.1
django compatibility django-models django-south django-reversion
我有一个现有的Django项目,它有几个使用基类的具体继承的模型.在仔细考虑之后,在阅读了像雅各布·卡普兰 - 莫斯这样的人对此有所说明后,在我的案例中使用这种具体的继承是不必要的.我想迁移到使用抽象基类.
使这个变得复杂的是我的网站是实时的,我有用户输入的数据.因此,在整个转换过程中,我需要保持所有数据的完整性.
我举一个更具体的例子:
APP1/models.py:
class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
APP 2/models.py:
class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
base_app/models.py:
class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
APP1/models.py:
class Model1(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
APP 2/models.py:
class Model2(base_app.models.BaseModel):
field1 = models.CharField(max_length=1000)
field2 = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
base_app/models.py:
class BaseModel(models.Model):
user = models.ForeignKey(User)
another_field = models.CharField(max_length=1000)
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
现在,我的计划是首先添加abstract = True到BaseModel.然后,对于每个使用的模型BaseModel,一次一个:
首先,这会有用吗?第二,有更好的方法吗? …
我有一个有三个领域的模型
class MyModel(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
c = models.ForeignKey(C)
Run Code Online (Sandbox Code Playgroud)
我想强制这些字段之间的唯一约束,并找到django的unique_together,这似乎是解决方案.但是,我已经有了一个现有的数据库,并且有很多重复数据库.我知道,因为unique_together在数据库级别工作,我需要使用unique-ify行,然后尝试迁移.
有没有一个很好的方法来删除重复项(副本具有相同的(A,B,C)),以便我可以运行迁移来获取unique_togethercontstraint?
我用南方来迁移我的django模型.然而,南方有一个令人讨厌的虫子.它没有在Postgres数据库中设置默认值.例:
created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)
Run Code Online (Sandbox Code Playgroud)
South会将这两个字段添加到数据库中,但无法设置其默认值,这需要手动完成.
这个bug有没有补丁?
更新
我已经尝试过设置默认日期auto_now_add=True,但这也没有设置默认值.添加null=True字段会添加db.alter_column由南方生成的迁移脚本.但是这只会删除NOT NULL约束,不添加默认值.整数字段相同
我正在开始一个新项目,我正在使用Django 1.5.我发现localflavor的东西已经从Django 1.5中删除了,现在是一个单独的可安装包.所以我安装了它.在我的models.py中,我正在导入US localflavors来获取我的状态:
from django_localflavor_us.models import USStateField
Run Code Online (Sandbox Code Playgroud)
在我的模型中,我有这个领域:
state = USStateField(default='VA')
Run Code Online (Sandbox Code Playgroud)
当我尝试使用South运行迁移时,我现在收到以下消息:
!无法冻结字段'playerstats.location.state'!(此字段包含类django_localflavor_us.models.USStateField)
!南方不能反省某些领域; 这可能是因为他们是定制的!领域.如果他们在0.6或以下工作,这是因为我们已经删除了!模型解析器(它经常破坏东西).!要解决此问题,请阅读http://south.aeracode.org/wiki/MyFieldsDontWork
我阅读了维基文章,但我发现它非常冗长和复杂.我的USStateField现在不被认为是1.5中的自定义字段了吗?还有其他人在1.5中遇到过这个问题吗?你是怎么解决的?
编辑:我解决了这个问题.问题是我打开了一个与该模型建立数据库连接的shell.我退出了外壳,一切都在继续.
我刚刚用南迁移了我的数据库,但是我没有迁移一个应用程序,而是意外地迁移了整个项目(./manage.py migrate).一切都很顺利,直到它到达需要迁移的应用程序.我没有得到错误,但它挂在那一点:
~/django/baeren $ ./manage.py migrate
Running migrations for home:
- Nothing to migrate.
- Loading initial data for home.
Installed 0 object(s) from 0 fixture(s)
Running migrations for price:
- Nothing to migrate.
- Loading initial data for price.
Installed 0 object(s) from 0 fixture(s)
Running migrations for gallery:
- Nothing to migrate.
- Loading initial data for gallery.
Installed 0 object(s) from 0 fixture(s)
Running migrations for menu:
- Migrating forwards to 0006_auto__add_field_menu_category.
> menu:0006_auto__add_field_menu_category …Run Code Online (Sandbox Code Playgroud) 我正在研究一个非常复杂的Django项目(50多个模型),它有一些复杂的逻辑(许多不同的工作流程,视图,信号,API,后台任务等).我们称之为project-base.目前正在使用Django 1.6 + South迁移和其他一些第三方应用程序.
现在,其中一个要求是创建一个这个项目的分支,它将在这里和那里添加一些字段/模型以及一些额外的逻辑.我们称之为project-fork.大多数额外的工作将在现有模型之上,但也会有一些新的.
随着project-base未来的发展,我们希望这些功能也能进入project-fork(就像git-land中的rebase/merge).额外的更改project-fork将不会合并回来project-base.
有什么可能是实现这一目标的最佳方式?以下是我的一些想法:
使用南合并在project-fork保持它最新的与最新变化project-base,为解释在这里.使用信号和任何其他必要手段来保持新逻辑project-fork尽可能松散耦合,以避免任何潜在的冲突.
不要修改任何原始project-base模型,而是在引用旧模型的不同应用程序中创建新模型(即使用OneToOneField).额外的逻辑可能会在旧的和/或新的应用程序中结束.
你的想法请:)
我会选择选项1,因为它看起来整体上并不复杂,但可能会带来更大的风险.以下是我将如何看待它:
迁移project-base:
迁移project-fork:
合并后,迁移将如下所示:
使用这种方法有任何陷阱吗?有没有更好的办法?
感谢您的时间.
我有M2M字段的用户配置文件模型
class Account(models.Model):
...
friends = models.ManyToManyField('self', symmetrical=True, blank=True)
...
Run Code Online (Sandbox Code Playgroud)
现在我需要知道HOW和WHEN如何作为朋友互相添加我为此创建了一个模型
class Account(models.Model):
...
friends = models.ManyToManyField('self', symmetrical=False, blank=True, through="Relationship")
...
class Relationship(models.Model):
""" Friends """
from_account = models.ForeignKey(Account, related_name="relationship_set_from_account")
to_account = models.ForeignKey(Account, related_name="relationship_set_to_account")
# ... some special fields for friends relationship
class Meta:
db_table = "accounts_account_friends"
unique_together = ('from_account','to_account')
Run Code Online (Sandbox Code Playgroud)
我是否应该为此更改创建任何迁移?如果您有任何建议,请随时写下这里.
谢谢
PS:accounts_account表已包含记录
关于这个问题在PA论坛上发表我正面临让南方工作PA的问题,但这些日子看起来很有帮助的人很忙,所以我在这里.
据我所知,宾夕法尼亚州的Django与南方航行.
在PA上的bash控制台上的python shell中,import south不会返回任何错误.
我已经包含'south',在INSTALLED_APPSsettings.py文件的部分中.
我python manage.py syncdb在执行任何南方命令之前已经运行,并且syncdb运行但是我无法辨别该输出与非Southed的任何差异syncdb.这是输出:
创建表格......
安装自定义SQL ...
安装索引......
找不到固定装置.
试图运行任何南方命令返回Unknown Command: 'south_command'.这适用于以下所有:
python manage.py convert_to_south app_name
python manage.py schemamigration app_name --initial
python manage.py schemamigration app_name --auto
如果它有帮助,我已经使用PA教程中建议的手动配置方法设置了我的Web应用程序,而不是Django项目.
我真的被困在第0步,任何帮助都会受到赞赏,在此先感谢!
我一直在使用Django 1.5进行开发.是否值得花时间从Django 1.5转换到Django 1.6或Django 1.7?我知道,在1.7中,迁移是Django的核心.与南方有何不同?
django ×10
django-south ×10
migration ×2
python ×2
django-1.5 ×1
django-1.6 ×1
merge ×1
rebase ×1