我们打算将我们的模型之一从旧的开始结束日期值重新设计为使用开始日期和长度。然而,这确实带来了挑战,因为我们想要为新字段提供默认值。
在这种情况下,是否可以在我们创建新字段的地方运行迁移,并根据模型旧的起始字段为其赋予一个值
from datetime import date as Date
from django.db import models
class Period(models.Model):
#These are our new fields to replace old fields
period_length=models.IntegerField(default=12)
starting_date=models.DateField(default=Date.today)
#Old fields. We want to calculate the period length based on these before we remove them
start_day = models.IntegerField(default=1)
start_month = models.IntegerField(default=1)
end_day = models.IntegerField(default=31)
end_month = models.IntegerField(default=12)
Run Code Online (Sandbox Code Playgroud)
开始月份和结束月份可以是 1 到 12 之间的任意数字,因此我们需要进行大量计算才能获得正确的长度。有没有一种方法可以让我们在迁移中运行一个函数,在添加新字段之后,在调用删除旧字段之前计算它们的新值?
我确实知道我可以使用 makemigrations 创建基本的添加/删除字段,但我想在两者之间添加值计算。我考虑过的其他选择是首先运行迁移来添加字段,然后运行自定义命令来计算字段,然后进行第二次迁移来删除旧字段,但这感觉更有可能破坏某些内容。
我创建了一个空迁移,现在看起来像这样:
def forwards(apps, schema_editor):
Foo = apps.get_model('app', 'Foo')
FixedResponse.objects.create(name='Bar')
def backwards(apps, schema_editor):
Foo = apps.get_model('app', 'Foo')
Foo.objects.filter(name='Bar').delete()
class Migration(migrations.Migration):
dependencies = [
('app', '0035_fixedresponse'),
]
operations = [
migrations.RunPython(forwards, backwards)
]
Run Code Online (Sandbox Code Playgroud)
由于没有关于此主题(特定于迁移)或最佳实践的 Django 文档,
我想知道如何输入提示上面的代码?
我正在尝试使用IPN实现django-paypal(dcramer的版本),虽然我收到了通知,但它回答了500错误.我检查了调试日志,看到了这条消息:
DatabaseError: (1146, "Table 'myproject.paypal_ipn' doesn't exist")
我发现没有任何关于pypal_ipn表的教程.我还做了一个syncdb和一个南迁移但是没有创建表.
我究竟做错了什么?
这是我用syncdb得到的:
Synced:
> django.contrib.auth
> django.contrib.contenttypes
> django.contrib.sessions
> django.contrib.sites
> django.contrib.messages
> django.contrib.staticfiles
> debug_toolbar
> grappelli
> filebrowser
> tinymce
> south
> avatar
> django.contrib.admin
> notification
Not synced (use migrations):
- paypal.standard.ipn
$ python manage.py schemamigration main --auto
Nothing seems to have changed.
$ python manage.py migrate main
Running migrations for main:
- Nothing to migrate.
- Loading initial data for main.
No fixtures found.
Run Code Online (Sandbox Code Playgroud) Django 1.7现在要求设置迁移.不幸的是,在默认字段值中使用lambdas或类似方法会破坏此过程.
我在模型中有以下内容:
def make_uuid(type):
"""Takes an entity type identifier string as input and returns a hex of UUID2 with a
type identifier pre-pended for readability"""
return str(type)+str(uuid.uuid1().hex)
class Accounts(models.Model):
"""Model representing Accounts"""
PENDING_STATUS = 0
ACTIVE_STATUS = 1
SUSPENDED_STATUS = 2
CANCELLED_STATUS = 3
BETA_STATUS = 4
STATUS_CHOICES = (
(PENDING_STATUS, 'Pending'),
(ACTIVE_STATUS, 'Active'),
(SUSPENDED_STATUS, 'Suspended'),
(CANCELLED_STATUS, 'Cancelled'),
(BETA_STATUS, 'Beta'),
)
account_name = models.CharField(max_length=255)
account_uuid = models.CharField(max_length=34, default=partial(make_uuid,'AC'), db_index=True, unique=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
updated_by = models.ForeignKey(User, …Run Code Online (Sandbox Code Playgroud) 在我的django项目中,我一直在使用django-taggit向模型添加标记功能。
迁移添加标签还将初始taggit迁移列为依赖项:
dependencies = [
('taggit', '0001_initial'),
# …
]
Run Code Online (Sandbox Code Playgroud)
稍后,我在所有地方都删除了taggit,其中包括INSTALLED_APPS。
问题在于django无法解决属于taggit的迁移,并引发了错误。
在这种情况下首选的解决方案是什么?
我可以想到一个两步策略:
INSTALLED_APPS,直到运行该项目的所有服务器是最新的INSTALLED_APPSDjango文档说,我们可以在压缩迁移后删除它们:
您应该进行此迁移,但将旧迁移保留在原位置;新的迁移将用于新安装。一旦确定代码库的所有实例都应用了压缩的迁移,就可以删除它们。
在这里,删除是否意味着仅删除迁移文件或django_migrations表中的条目?
这里是一些背景:我只有开发机器,所以只有一个代码库。压缩一些已经应用的迁移后,我删除了文件和数据库条目。通过进行迁移测试是否可以,它没有找到任何东西。因此,一切看起来都不错。第二天,我不得不进行一些更改,并进行了迁移。当我尝试迁移时,它也尝试应用压缩的迁移(在压缩之前已部分应用)。因此,我不得不返回并在django_migrations表中重新创建条目。因此,似乎我不得不保留数据库条目。我试图确保在再次弄乱任何东西之前,先弄清楚为什么它看起来不错,然后再尝试应用压缩后的迁移。
我使用我的django迁移来迁移我的数据库.迁移之一是数据迁移.但我犯了一个错误(我没有保存模型)因此没有对数据进行任何更改.我更正了执行数据迁移的python代码的.py文件,并希望重新执行它.有没有办法回滚到以前版本的数据库或只是运行
./manage.py migrate my_app 0004
Run Code Online (Sandbox Code Playgroud)
用0004作为数据游戏的文件可以解决问题吗?
我正在为app创建一个数据迁移Notification,在这里我正在使用Managerapp 的模型引用accounts
Manager = apps.get_model("accounts", "Manager")
Run Code Online (Sandbox Code Playgroud)
它抛出错误:
self.code(from_state.render(), schema_editor)
File "/home/notifications/migrations/0004_auto_20150720_0127.py", line 12, in set_notification_setttings
Manager = apps.get_model("accounts", "Manager")
File "/home/local/lib/python2.7/site-packages/django/apps/registry.py", line 202, in get_model
return self.get_app_config(app_label).get_model(model_name.lower())
File "/home/local/lib/python2.7/site-packages/django/apps/registry.py", line 150, in get_app_config
raise LookupError("No installed app with label '%s'." % app_label)
LookupError: No installed app with label 'accounts'
Run Code Online (Sandbox Code Playgroud)
虽然从shell我尝试了类似的东西,它的工作原理
>> from django.apps import apps
>> apps.get_app_config('accounts').get_model('Manager'.lower())
>> accounts.models.Manager
Run Code Online (Sandbox Code Playgroud)
关于为什么在迁移的情况下它失败了?
可以说我有以下基本模型:
class human(models.Model):
gender = models.BooleanField()
age = models.IntegerField()
name = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)
还有两个继承它的模型:
class superhero(human):
can_fly = models.BooleanField()
class villain(human):
fingerprint = models.ImageField()
Run Code Online (Sandbox Code Playgroud)
在开发过程中的某个时候,我意识到我实际上并不需要直接的人类阶级。我只需要它成为超级英雄和反派模型的一组模板参数。如果现在我去上人类Meta课,abstract=True像这样设置和更改我的模型:
class human(models.Model):
gender = models.BooleanField()
age = models.IntegerField()
name = models.CharField(max_length=200)
class Meta:
abstract = True
class superhero(human):
can_fly = models.BooleanField()
class villain(human):
fingerprint = models.ImageField()
Run Code Online (Sandbox Code Playgroud)
尝试进行迁移和迁移将引发以下错误
“超级英雄”类中的本地字段“性别”与基类“人类”中的相似名称字段发生冲突
如何在不直接修改数据库的情况下切换到抽象类,保留所有迁移?
python django abstract-class django-models django-migrations
我已经阅读了一些关于这个问题的问题,这个问题也没有为我的案例给出正确答案:
我在已经存在的模型中添加了created_time字段,因此mysql表中没有属于该模型的日期.
class Configs(models.Model):
...
creation_date = models.DateTimeField(auto_now_add=True, blank=True)
...
Run Code Online (Sandbox Code Playgroud)
我使用了迁移 python manage.py makemigrations
我收到这个错误:
您试图在没有默认值的情况下向集合中添加不可为空的字段"creation_date"; 我们不能那样做(数据库需要一些东西来填充现有的行).请选择一个修复:
我尝试了很多选择:
creation_date = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
这个给出了同样的错误.
如果设置中的USE_TZ设置为False,如何实现此迁移?
顺便说一下,这是Django 1.9.4 makemigrations脚本中的一个错误吗?