2014-10-22 4 views
23

내 모델 필드 중 help_text 또는 verbose_name을 변경하고 python manage.py makemigrations을 실행하면 이러한 변경 사항을 감지하고 새로운 마이그레이션 즉, 0002_xxxx.py을 생성합니다.Django가 help_text 및 verbose_name에 대한 마이그레이션을 변경하는 이유는 무엇입니까?

저는 PostgreSQL을 사용하고 있습니다.이 변경 사항은 내 데이터베이스와 관련이 없습니다 (이러한 변경 사항이 관련된 DBMS가 존재하는지 궁금합니다).

왜 장고는 이러한 변경 사항에 대한 마이그레이션을 생성합니까? 그것들을 무시할 수있는 선택입니까?

0002_xxxx.py에서 이전 마이그레이션 (0001_initial.py)으로의 변경을 수동으로 안전하게 적용하고 0002_xxxx.py을 안전하게 삭제할 수 있습니까?

이전 이전을 자동으로 업데이트 할 수있는 방법이 있습니까?

+2

이 andrewgodwin에서이 댓글이 문제를 부분적으로 만 대답 여전히 마이그레이션을 업데이트 할 필요없이'help_text'를 바꿀 수 있기를 원합니다 : https://code.djangoproject.com/ticket/21498#comment:6 – utapyngo

답변

7

This ticket이 문제를 해결했습니다. & 변경된 경우 django는 새 마이그레이션을 생성합니다. 최신 마이그레이션에서 이전 마이그레이션으로 변경 사항을 적용하고 최신 마이그레이션을 삭제할 수 있습니다.

이전 마이그레이션의 help_text을 최신 마이그레이션에있는 help_text로 변경하고 최신 마이그레이션 파일을 삭제하십시오. 해당 *.pyc 파일이 있으면 제거해야합니다. 그렇지 않으면 예외가 발생합니다. 당신은 같이 할 수있는 불필요한 마이그레이션을 방지하기 위해

4

은 다음과 같습니다 마이그레이션

  • 해당 필드 안에 방법을 해체 사용자 정의 쓰기
  • 이익
  • 원인

    1. 서브 클래스 필드를

    예 :

    from django.db import models 
    
    class CustomCharField(models.CharField): # or any other field 
    
        def deconstruct(self): 
         name, path, args, kwargs = super(CustomCharField, self).deconstruct() 
         # exclude all fields you dont want to cause migration, my example below: 
         if 'help_text' in kwargs: 
          del kwargs['help_text'] 
         if 'verbose_name' in kwargs: 
          del kwargs['verbose_name'] 
         return name, path, args, kwargs 
    

    도움이 되길 바랍니다

    1

    @ChillarAnand는이 문제를 해결하는 티켓이 있지만 현재까지 (django 1.9.1) 마이그레이션 명령은 수정되지 않았다고 지적했습니다.

    를 고정의 이상 관입 방법은

    #coding: utf-8 
    
    from django.core.management.base import BaseCommand 
    from django.core.management.commands.makemigrations import Command as MakeMigrations 
    
    
    class Command(MakeMigrations): 
        leave_locale_alone = True 
        can_import_settings = True 
    
        def handle(self, *app_labels, **options): 
         super(Command, self).handle(*app_labels, **options) 
    

    <your-project>/management/commands/maketranslatedmigrations.py에서 자신의 maketranslatedmigrations 명령을 생성하는 것입니다 그리고 당신은 원래 makemigrations으로 정확히 같은 사용할 수 있습니다.

    P. 경로 나는 당신이 필요로 일부 유틸/모델에 저장하는 것입니다 목적

    에 대한 사용자 정의 모듈을 작성했습니다

    +0

    원래 질문은'makemigrations'에 관한 것이지'maketranslations'에 관한 것이 아닙니다. – utapyngo

    +0

    오타를 지적 해 주셔서 감사합니다 – katomaso

    0

    에 사방 __init__.py 파일을 추가하는 것을 잊지 마십시오.이 https://github.com/FeroxTL/django-migration-control

    # models.py

    # -*- coding: utf-8 -*- 
    from types import FunctionType 
    from django.db import models 
    
    
    class NoMigrateMixin(object): 
        """ 
        Позволяет исключить из миграций различные поля 
        """ 
        def deconstruct(self): 
         name, path, args, kwargs = super(NoMigrateMixin, self).deconstruct() 
         kwargs.pop('help_text', None) 
         kwargs.pop('verbose_name', None) 
         return name, path, args, kwargs 
    
    
    # ============================================================================= 
    # DJANGO CLASSES 
    # ============================================================================= 
    
    for name, cls in models.__dict__.items(): 
        if isinstance(cls, type): 
         if issubclass(cls, models.Field): 
          # Поля 
          globals()[name] = type(name, (NoMigrateMixin, cls), {}) 
         else: 
          # Всякие менеджеры 
          globals()[name] = cls 
        elif isinstance(cls, FunctionType): 
         # Прочие функции 
         globals()[name] = cls 
    
    을 시도 : DB는 대신 from django.db import models 쓰기의 모든 모델에 from utils import models

    누군가가 내가

    UPD 구성 요소를 작성하고 pypi에 게시 할 수 있습니다 그것에 관심이 있다면

    8

    squash it with the previous migration 수 있습니다.

    아니면 출력하지 않으려면 전혀 그 마이그레이션, 당신은 앱에서 management/commands/makemigrations.py이를 바꾸어 makemigrationsmigrate 명령을 재정의 할 수

    from django.core.management.commands.makemigrations import Command 
    from django.db import models 
    
    IGNORED_ATTRS = ['verbose_name', 'help_text', 'choices'] 
    
    original_deconstruct = models.Field.deconstruct 
    
    def new_deconstruct(self): 
        name, path, args, kwargs = original_deconstruct(self) 
        for attr in IGNORED_ATTRS: 
        kwargs.pop(attr, None) 
        return name, path, args, kwargs 
    
    models.Field.deconstruct = new_deconstruct 
    
    +0

    감사합니다. 사실 이후에 그렇게 분명해 보입니다. 이것은 일부 철학 (완전한 마이그레이션)입니다. 실제로는 작동하지 않는다는 점을 제외하고는 이론적으로 훌륭합니다. 특히 help_text, 선택 사항 및'storage'! 스토리지 관리자 및 경로는 런타임에 결정되므로 ... 무엇을 마이그레이션을 위해 가짜 스토리지로 만들겠습니까? 가. 이를 통해 해결해야 할 문제는 모델 관심사와 런타임 문제를 구분합니다. –