(streamfield_data_migration_reference)= # StreamField 데이터 마이그레이션 참조 ## wagtail.blocks.migrations.migrate_operation ### MigrateStreamData ```python class MigrateStreamData(RunPython) ``` `StreamField` 데이터 마이그레이션 작업을 위한 RunPython의 서브클래스 #### \_\_init\_\_ ```python def __init__(app_name, model_name, field_name, operations_and_block_paths, revisions_from=None, chunk_size=1024, **kwargs) ``` MigrateStreamData 생성자 **인수**: - `app_name` _str_ - 앱 이름. - `model_name` _str_ - 모델 이름. - `field_name` _str_ - `StreamField` 이름. - `operations_and_block_paths` _List[Tuple[operation, str]]_ - 작업 및 적용할 블록 경로 목록. - `revisions_from` _datetime, optional_ - 이 날짜 이후에 생성된 개정만 업데이트됩니다. `None` 을 전달하면 모든 개정이 업데이트됩니다. 기본값은 `None` 입니다. 라이브 및 최신 개정은 이 값에 관계없이 업데이트됩니다. - `chunk_size` _int, optional_ - `queryset.iterator` 및 `bulk_update` 에 대한 청크 크기. 기본값은 1024입니다. - `**kwargs` - 상위 클래스 `RunPython` 에 대한 atomic, elidable, hints를 제공할 수 있습니다. **예시**: `field1` 이라는 블록 이름을 `block1` 으로 변경: ```python MigrateStreamData( app_name="blog", model_name="BlogPage", field_name="content", operations_and_block_paths=[ (RenameStreamChildrenOperation(old_name="field1", new_name="block1"), ""), ], revisions_from=datetime.datetime(2022, 7, 25) ) ``` ## wagtail.blocks.migrations.operations (rename_stream_children_operation)= ### RenameStreamChildrenOperation ```python class RenameStreamChildrenOperation(BaseBlockOperation) ``` 주어진 유형의 모든 `StreamBlock` 자식 이름 변경 **참고**: 이 작업을 사용할 때 `block_path_str` 은 이름이 변경될 블록이 아닌 이름이 변경될 블록을 포함하는 부모 `StreamBlock` 을 가리켜야 합니다. **속성**: - `old_name` _str_ - 이름이 변경될 자식 블록 유형의 이름 - `new_name` _str_ - 변경할 새 이름 (rename_struct_children_operation)= ### RenameStructChildrenOperation ```python class RenameStructChildrenOperation(BaseBlockOperation) ``` 주어진 유형의 모든 `StructBlock` 자식 이름 변경 **참고**: 이 작업을 사용할 때 `block_path_str` 은 이름이 변경될 블록이 아닌 이름이 변경될 블록을 포함하는 부모 `StructBlock` 을 가리켜야 합니다. **속성**: - `old_name` _str_ - 이름이 변경될 자식 블록 유형의 이름 - `new_name` _str_ - 변경할 새 이름 (remove_stream_children_operation)= ### RemoveStreamChildrenOperation ```python class RemoveStreamChildrenOperation(BaseBlockOperation) ``` 주어진 유형의 모든 `StreamBlock` 자식 제거 **참고**: 이 작업을 사용할 때 `block_path_str` 은 제거될 블록이 아닌 제거될 블록을 포함하는 부모 `StreamBlock` 을 가리켜야 합니다. **속성**: - `name` _str_ - 제거될 자식 블록 유형의 이름 (remove_struct_children_operation)= ### RemoveStructChildrenOperation ```python class RemoveStructChildrenOperation(BaseBlockOperation) ``` 주어진 유형의 모든 `StructBlock` 자식 제거 **참고**: 이 작업을 사용할 때 `block_path_str` 은 제거될 블록이 아닌 제거될 블록을 포함하는 부모 `StructBlock` 을 가리켜야 합니다. **속성**: - `name` _str_ - 제거될 자식 블록 유형의 이름 (stream_children_to_list_block_operation)= ### StreamChildrenToListBlockOperation ```python class StreamChildrenToListBlockOperation(BaseBlockOperation) ``` 주어진 유형의 `StreamBlock` 자식을 새 `ListBlock` 으로 결합 **참고**: 이 작업을 사용할 때 `block_path_str` 은 자식 블록 자체가 아닌 결합될 블록을 포함하는 부모 `StreamBlock` 을 가리켜야 합니다. **속성**: - `block_name` _str_ - 결합될 자식 블록 유형의 이름 - `list_block_name` _str_ - 새 `ListBlock` 유형의 이름 (stream_children_to_stream_block_operation)= ### StreamChildrenToStreamBlockOperation ```python class StreamChildrenToStreamBlockOperation(BaseBlockOperation) ``` 주어진 유형의 `StreamBlock` 자식을 새 `StreamBlock` 으로 결합 **참고**: 이 작업을 사용할 때 `block_path_str` 은 자식 블록 자체가 아닌 결합될 블록을 포함하는 부모 `StreamBlock` 을 가리켜야 합니다. **속성**: - `block_names` _[str]_ - 결합될 자식 블록 유형의 이름 - `stream_block_name` _str_ - 새 `StreamBlock` 유형의 이름 (alter_block_value_operation)= ### AlterBlockValueOperation ```python class AlterBlockValueOperation(BaseBlockOperation) ``` 각 블록의 값을 주어진 값으로 변경 **속성**: - `new_value`: 변경할 새 값 (stream_children_to_struct_block_operation)= ### StreamChildrenToStructBlockOperation ```python class StreamChildrenToStructBlockOperation(BaseBlockOperation) ``` 주어진 유형의 각 `StreamBlock` 자식을 새 `StructBlock` 안으로 이동 주어진 유형의 각 자식 블록에 대해 부모 `StreamBlock` 의 자식으로 새 `StructBlock` 이 생성되고, 해당 자식 블록은 부모 StreamBlock의 자식에서 새 `StructBlock` 안으로 이동됩니다. **예시**: 다음 `StreamField` 정의를 고려해 봅시다. ```python mystream = StreamField([("char1", CharBlock()), ...], ...) ``` 그러면 스트림 데이터는 다음과 같습니다. ```python [ ..., { "type": "char1", "value": "Value1", ... }, { "type": "char1", "value": "Value2", ... }, ... ] ``` 그리고 다음과 같이 작업을 정의하면: ```python StreamChildrenToStructBlockOperation("char1", "struct1") ``` 변경될 스트림 데이터는 다음과 같습니다. ```python [ ..., { "type": "struct1", "value": { "char1": "Value1" } }, { "type": "struct1", "value": { "char1": "Value2" } }, ..., ] ``` **참고**: - 이 작업을 사용할 때 `block_path_str` 은 자식 블록 자체가 아닌 결합될 블록을 포함하는 부모 `StreamBlock` 을 가리켜야 합니다. - 새 블록은 이전 블록과 구조적으로 다르므로 블록 ID는 여기에 보존되지 않습니다. **속성**: - `block_names` _str_ - 결합될 자식 블록 유형의 이름 - `struct_block_name` _str_ - 새 `StructBlock` 유형의 이름 ## wagtail.blocks.migrations.utils ### InvalidBlockDefError ```python class InvalidBlockDefError(Exception) ``` 유효하지 않은 블록 정의에 대한 예외 #### map_block_value ```python def map_block_value(block_value, block_def, block_path, operation, **kwargs) ``` 블록의 값을 매핑합니다. **인수**: - `block_value`: 블록의 값입니다. 구조 블록의 경우 자식 목록 또는 사전입니다. - `block_def`: 블록의 정의입니다. - `block_path`: 현재 블록(포함되지 않음)에서 값이 작업에 전달될 중첩 블록까지의 블록 이름 목록으로 `.` 으로 구분됩니다. - `operation`: `apply` 메서드가 값을 매핑하는 `BaseBlockOperation` 을 확장하는 Operation 클래스 인스턴스입니다. **반환값**: 변환된 값 #### map_struct_block_value ```python def map_struct_block_value(struct_block_value, block_def, block_path, **kwargs) ``` `StructBlock` 값의 각 자식 블록을 매핑합니다. **인수**: - `stream_block_value`: `StructBlock` 의 값으로, 자식 블록의 사전입니다. - `block_def`: `StructBlock` 의 정의입니다. - `block_path`: 현재 블록(포함되지 않음)에서 값이 작업에 전달될 중첩 블록까지의 블록 이름 목록으로 `.` 으로 구분됩니다. **반환값**: - mapped_value: 자식을 변환한 후의 `StructBlock` 값입니다. #### map_list_block_value ```python def map_list_block_value(list_block_value, block_def, block_path, **kwargs) ``` `ListBlock` 값의 각 자식 블록을 매핑합니다. **인수**: - `stream_block_value`: `ListBlock` 의 값으로, 자식 블록 목록입니다. - `block_def`: `ListBlock` 의 정의입니다. - `block_path`: 현재 블록(포함되지 않음)에서 값이 작업에 전달될 중첩 블록까지의 블록 이름 목록으로 `.` 으로 구분됩니다. **반환값**: - mapped_value: 모든 자식을 변환한 후의 `ListBlock` 값입니다. #### apply_changes_to_raw_data ```python def apply_changes_to_raw_data(raw_data, block_path_str, operation, streamfield, **kwargs) ``` 원시 스트림 데이터에 변경 사항 적용 **인수**: - `raw_data`: 현재 스트림 데이터(최상위 블록 목록) - `block_path_str`: 최상위 블록에서 값이 작업에 전달될 중첩 블록까지의 블록 이름 목록으로 `.` 으로 구분됩니다. - `operation`: `operations.BaseBlockOperation` 의 서브클래스입니다. 일치하는 블록 값에 변경 사항을 적용하기 위한 `apply` 메서드가 있습니다. - `streamfield`: 데이터가 마이그레이션되는 `StreamField` 입니다. 블록의 정의를 가져오는 데 사용됩니다. **반환값**: altered_raw_data: ## 블록 경로 `wagtail.blocks.migrations` 에 정의된 `StreamField` 데이터 마이그레이션 작업에는 적용할 블록을 결정하기 위한 "블록 경로"가 필요합니다. ``` block_path = "" | block_name ("." block_name)* block_name = str ``` 블록 경로는 다음 중 하나입니다. - 빈 문자열. 이 경우 작업은 최상위 스트림에 적용됩니다. - 블록 이름의 `.`(점)으로 구분된 시퀀스. 여기서 블록 이름은 `StreamField` 정의에서 블록에 지정된 이름입니다. 블록 이름은 스트림 데이터의 사전 구조에서 `"type"` 키와 연결된 값입니다. 따라서 `ListBlock` 멤버를 탐색하거나 선택하려면 `"item"` 블록 이름을 사용해야 합니다. 작업의 `apply` 메서드가 받는 값은 블록 경로의 터미널 블록 이름과 연결된 사전의 `"value"` 멤버입니다. 예시는 [튜토리얼](using_streamfield_migration_block_paths)을 참조하십시오.