IT

장고 - South를 사용하여 모델 필드의 이름을 변경하는 방법

itgroup 2022. 11. 27. 11:25
반응형

장고 - South를 사용하여 모델 필드의 이름을 변경하는 방법

모델의 특정 필드 이름을 변경하고 싶습니다.

class Foo(models.Model):
    name = models.CharField()
    rel  = models.ForeignKey(Bar)

다음 항목으로 변경해야 합니다.

class Foo(models.Model):
    full_name     = models.CharField()
    odd_relation  = models.ForeignKey(Bar)

South를 사용하여 이것을 하는 가장 쉬운 방법은 무엇입니까?

기능을 사용할 수 있습니다.

class Migration:

    def forwards(self, orm):
        # Rename 'name' field to 'full_name'
        db.rename_column('app_foo', 'name', 'full_name')




    def backwards(self, orm):
        # Rename 'full_name' field to 'name'
        db.rename_column('app_foo', 'full_name', 'name')

의 첫 번째 논거는db.rename_column테이블명이므로 Django가 테이블명을 작성하는 방법을 기억해야 합니다.

Django는 모델 클래스의 이름과 이를 포함하는 앱에서 데이터베이스 테이블의 이름을 자동으로 가져옵니다.모델의 데이터베이스 테이블 이름은 모델의 "앱 레이블"(관리에서 사용한 이름)에 가입하여 구성됩니다.py startapp - 모델 클래스 이름에 밑줄 포함.

프로젝트와 같이 여러 단어로 된 카멜 대문자 모델 이름이 있는 경우항목, 테이블 이름은 다음과 같습니다.app_projectitem(즉, 밑줄은 삽입되지 않습니다.project그리고.item낙타상자임에도 불구하고)

제가 하는 일은 다음과 같습니다.

  1. 모델에서 열 이름을 변경합니다(이 예에서는 다음과 같습니다).myapp/models.py)
  2. 달려../manage.py schemamigration myapp renaming_column_x --auto

메모renaming_column_x임의의 이름을 지정할 수 있습니다.이거는 이행 파일에 알기 쉬운 이름을 붙이는 방법입니다.

이렇게 하면 다음과 같은 파일이 생성됩니다.myapp/migrations/000x_renaming_column_x.py그러면 이전 열이 삭제되고 새 열이 추가됩니다.

이 파일의 코드를 수정하여 마이그레이션 동작을 단순 이름 변경으로 변경합니다.

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Renaming column 'mymodel.old_column_name' to 'mymodel.new_column_name'
        db.rename_column(u'myapp_mymodel', 'old_column_name', 'new_column_name')

    def backwards(self, orm):
        # Renaming column 'mymodel.new_column_name' to 'mymodel.old_column_name'
        db.rename_column(u'myapp_mymodel', 'new_column_name', 'old_column_name')

db.rename 컬럼에 대해서는 몰랐습니다만, 이전에는 새로운 컬럼을 하나의 스키마마이그레이션으로 추가하고 새로운 필드에 값을 이동하기 위한 데이터마이그레이션을 작성한 후 오래된 컬럼을 삭제하는 두 번째 스키마마이그레이션을 작성했습니다.

Django 1.7은 이행을 도입하여 이행을 관리하기 위해 추가 패키지를 설치할 필요가 없습니다.

모델 이름을 변경하려면 먼저 빈 마이그레이션을 생성해야 합니다.

$ manage.py makemigrations <app_name> --empty

그런 다음 다음과 같이 마이그레이션 코드를 편집해야 합니다.

from django.db import models, migrations

class Migration(migrations.Migration):

dependencies = [
    ('yourapp', 'XXXX_your_previous_migration'),
]

operations = [
    migrations.RenameField(
        model_name='Foo',
        old_name='name',
        new_name='full_name'
    ),
    migrations.RenameField(
        model_name='Foo',
        old_name='rel',
        new_name='odd_relation'
    ),
]

그런 다음 실행해야 합니다.

$ manage.py migrate <app_name>

모델을 변경하고 실행하기만 하면 됩니다.makemigrations1.9로

Django는 사용자가 단일 필드를 삭제 및 생성한 것을 자동으로 감지하고 다음과 같이 묻습니다.

Did you rename model.old to model.new (a IntegerField)? [y/N]

'예'라고 대답하면 적절한 이행이 작성됩니다.마술.

  1. 더하다south프로젝트 설정 파일에 설치된 앱으로 이동합니다.
  2. 추가/수정된 필드/테이블을 코멘트 아웃합니다.
  3. $ manage.py Schemamigration <app_name> --initial
  4. $ manage.py migrate <app_name> --Fake
  5. 필드의 코멘트를 해제하고 수정된 필드를 씁니다.
  6. $ manage.py Schemamigration --auto
  7. $ manage.py migrate <app_name>

pycharm을 사용하는 경우 manage 대신 ctrl+shift+r을 사용할 수 있습니다.py' 및 'shift'를 입력합니다.

언급URL : https://stackoverflow.com/questions/3235995/django-how-to-rename-a-model-field-using-south

반응형