使用South修改模型字段的数据

苏拉卜

我有一个要重命名但也要更改其数据的模型。例如,模型字段foo包含char数据1... 6,我想通过以下方式映射此数据:

12-> 1&& 34-> 2&& 5-> 3&& 6->4

convert_to_south在我的应用程序上进行了操作,该应用程序创建了0001_initial然后更改了新的新字段,models.py并完成schemamigration0002_initial.py现在如何修改现有数据?这是我的迁移:

0001_initial

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Adding model 'Applicant'
        db.create_table(u'registrar_applicant', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('registered_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
            ('workshop', self.gf('django.db.models.fields.CharField')(max_length=20)),
            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
            ('semester', self.gf('django.db.models.fields.CharField')(max_length=1)),
            ('python_experience', self.gf('django.db.models.fields.CharField')(max_length=1)),
            ('phone_number', self.gf('django.db.models.fields.CharField')(max_length=10, blank=True)),
            ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
            ('solved_puzzle', self.gf('django.db.models.fields.BooleanField')(default=False)),
        ))
        db.send_create_signal(u'registrar', ['Applicant'])


    def backwards(self, orm):
        # Deleting model 'Applicant'
        db.delete_table(u'registrar_applicant')


    models = {
        u'registrar.applicant': {
            'Meta': {'ordering': "['-solved_puzzle', 'registered_at', 'semester', 'name']", 'object_name': 'Applicant'},
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
            'phone_number': ('django.db.models.fields.CharField', [], {'max_length': '10', 'blank': 'True'}),
            'python_experience': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
            'registered_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
            'semester': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
            'solved_puzzle': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
            'workshop': ('django.db.models.fields.CharField', [], {'max_length': '20'})
        }
    }

    complete_apps = ['registrar']

0002_initial

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Adding model 'Applicant'
        db.create_table(u'registrar_applicant', (
            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
            ('registered_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
            ('workshop', self.gf('django.db.models.fields.CharField')(max_length=20)),
            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
            ('year', self.gf('django.db.models.fields.CharField')(max_length=1)),
            ('python_experience', self.gf('django.db.models.fields.CharField')(max_length=1)),
            ('phone_number', self.gf('django.db.models.fields.CharField')(max_length=10, blank=True)),
            ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
            ('solved_puzzle', self.gf('django.db.models.fields.BooleanField')(default=False)),
        ))
        db.send_create_signal(u'registrar', ['Applicant'])


    def backwards(self, orm):
        # Deleting model 'Applicant'
        db.delete_table(u'registrar_applicant')


    models = {
        u'registrar.applicant': {
            'Meta': {'ordering': "['-solved_puzzle', 'registered_at', 'year', 'name']", 'object_name': 'Applicant'},
            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
            'phone_number': ('django.db.models.fields.CharField', [], {'max_length': '10', 'blank': 'True'}),
            'python_experience': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
            'registered_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
            'solved_puzzle': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
            'workshop': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
            'year': ('django.db.models.fields.CharField', [], {'max_length': '1'})
        }
    }

    complete_apps = ['registrar']
埃尔萨

为此,您必须创建一个数据迁移

# Run this command from the shell
python manage.py datamigration <app_name> change_foo_values

这将创建一个名为的迁移文件0003_change_foo_values.py您将必须手动编辑文件。

# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models

class Migration(DataMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        # Note: Don't use "from appname.models import ModelName". 
        # Use orm.ModelName to refer to models in this application,
        # and orm['appname.ModelName'] for models in other applications.
        orm.Applicant.objects.filter(foo__in=['1', '2']).update(foo='1')
        orm.Applicant.objects.filter(foo__in=['3', '4']).update(foo='2')
        orm.Applicant.objects.filter(foo__in=['5', '6']).update(foo='3')

    def backwards(self, orm):
        "Write your backwards methods here."

         # This migration cannot be reversed
         pass    # don't do anything when running reverse migration
         # or
         raise RuntimeError("Cannot reverse this migration") # stop south from reverting beyond this migration

注意:您将无法还原到该列的先前值。如果这不是问题,那就足够了。

但是,如果您确实希望能够撤消迁移,则建议创建一个新字段,该字段将保留每一行的旧值。

PS:您的迁移文件似乎不对。initial一个应用程序不应有两次迁移。convert_to_south重新命名模型(似乎尚未重命名)后,您是否再次运行?convert_to_south最初将现有模型转换为南方时,只需运行一次。之后,您需要创建架构迁移最简单的方法是schemamigration使用appname并--auto作为参数运行管理命令

python manage.py schemamigration <app_name> --auto

PPS:如果要重命名模型,请创建一个空迁移并自己编写迁移代码,只需使用即可db.rename_table如果重命名模型后尝试创建自动模式迁移,则IIRC south将在创建新表之前删除旧表。

python manage.py schemamigration <app_name> --empty rename_model_x_to_y

并在您的迁移文件中

# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models

class Migration(SchemaMigration):

    def forwards(self, orm):
        "Write your forwards methods here."
        # Note: Don't use "from appname.models import ModelName". 
        # Use orm.ModelName to refer to models in this application,
        # and orm['appname.ModelName'] for models in other applications.
        db.rename_table('old', 'new')

    def backwards(self, orm):
        "Write your backwards methods here."
        db.rename_table('new', 'old')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用属性修改模型字段Django

来自分类Dev

如何使用South将数据从字段迁移到表中的另一个字段

来自分类Dev

无法在Django 1.7中创建South数据库模型

来自分类Dev

无法在Django 1.7中创建South数据库模型

来自分类Dev

无法在Django 1.7中创建South数据库模型

来自分类Dev

在Django中临时修改模型的字段值

来自分类Dev

Django:在保存之前修改模型的字段

来自分类Dev

修改value字段的数据契约

来自分类Dev

Django South:在数据迁移中更改字段类型

来自分类Dev

在不使用South的Hierachy软件包中迁移模型

来自分类Dev

使用awk修改条件字段

来自分类Dev

如何使用数据为现有模型中的新模型字段设置默认值

来自分类常见问题

应用模型并修改Pandas数据框

来自分类Dev

应用模型并修改Pandas数据框

来自分类Dev

如何在Django中修改布尔型字段模型?

来自分类Dev

由于AttributeError,我无法使用south同步数据库

来自分类Dev

模型变更Django,Mezzanine,South

来自分类Dev

Django,使用ForeignKey将模型字段与管理模型字段链接

来自分类Dev

如何在计算中使用存储在 django 模型中的数据,然后将计算结果存储在 django 模型字段中?

来自分类Dev

django:如何从json数据更新模型字段

来自分类Dev

sequelize模型的字段数据类型

来自分类Dev

django:如何从json数据更新模型字段

来自分类Dev

如何使用EF 6在Web API数据中实现模型的计算字段

来自分类Dev

如何在Rails中使用STI从父模型中提取某些数据库字段

来自分类Dev

Django使用基于单选字段的模型数据自动填充整个表单

来自分类Dev

如何使用视图进入模板从Django一对多字段模型获取数据

来自分类Dev

Laravel雄辩:使用模型wherePivot等于自定义字段获取数据

来自分类Dev

如何在Rails中使用STI从父模型中提取某些数据库字段

来自分类Dev

使用nested_attributes设计-字段显示数据但不更新模型

Related 相关文章

  1. 1

    使用属性修改模型字段Django

  2. 2

    如何使用South将数据从字段迁移到表中的另一个字段

  3. 3

    无法在Django 1.7中创建South数据库模型

  4. 4

    无法在Django 1.7中创建South数据库模型

  5. 5

    无法在Django 1.7中创建South数据库模型

  6. 6

    在Django中临时修改模型的字段值

  7. 7

    Django:在保存之前修改模型的字段

  8. 8

    修改value字段的数据契约

  9. 9

    Django South:在数据迁移中更改字段类型

  10. 10

    在不使用South的Hierachy软件包中迁移模型

  11. 11

    使用awk修改条件字段

  12. 12

    如何使用数据为现有模型中的新模型字段设置默认值

  13. 13

    应用模型并修改Pandas数据框

  14. 14

    应用模型并修改Pandas数据框

  15. 15

    如何在Django中修改布尔型字段模型?

  16. 16

    由于AttributeError,我无法使用south同步数据库

  17. 17

    模型变更Django,Mezzanine,South

  18. 18

    Django,使用ForeignKey将模型字段与管理模型字段链接

  19. 19

    如何在计算中使用存储在 django 模型中的数据,然后将计算结果存储在 django 模型字段中?

  20. 20

    django:如何从json数据更新模型字段

  21. 21

    sequelize模型的字段数据类型

  22. 22

    django:如何从json数据更新模型字段

  23. 23

    如何使用EF 6在Web API数据中实现模型的计算字段

  24. 24

    如何在Rails中使用STI从父模型中提取某些数据库字段

  25. 25

    Django使用基于单选字段的模型数据自动填充整个表单

  26. 26

    如何使用视图进入模板从Django一对多字段模型获取数据

  27. 27

    Laravel雄辩:使用模型wherePivot等于自定义字段获取数据

  28. 28

    如何在Rails中使用STI从父模型中提取某些数据库字段

  29. 29

    使用nested_attributes设计-字段显示数据但不更新模型

热门标签

归档