docs/reference/streamfield/data_migrations.md
(streamfield_data_migration_reference)=
class MigrateStreamData(RunPython)
Subclass of RunPython for StreamField data migration operations
def __init__(app_name,
model_name,
field_name,
operations_and_block_paths,
revisions_from=None,
chunk_size=1024,
**kwargs)
MigrateStreamData constructor
Arguments:
app_name str - Name of the app.model_name str - Name of the model.field_name str - Name of the StreamField.operations_and_block_paths List[Tuple[operation, str]] - List of operations and the block paths to apply them to.revisions_from datetime, optional - Only revisions created from this date onwards will be updated. Passing None updates all revisions. Defaults to None. Note that live and latest revisions will be updated regardless of what value this takes.chunk_size int, optional - chunk size for queryset.iterator and bulk_update.
Defaults to 1024.**kwargs - atomic, elidable, hints for superclass RunPython can be givenExample:
Renaming a block named field1 to block1:
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)
)
(rename_stream_children_operation)=
class RenameStreamChildrenOperation(BaseBlockOperation)
Renames all StreamBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be renamed, not the block being renamed.
Attributes:
old_name str - name of the child block type to be renamednew_name str - new name to rename to(rename_struct_children_operation)=
class RenameStructChildrenOperation(BaseBlockOperation)
Renames all StructBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StructBlock which contains the blocks to be renamed, not the block being renamed.
Attributes:
old_name str - name of the child block type to be renamednew_name str - new name to rename to(remove_stream_children_operation)=
class RemoveStreamChildrenOperation(BaseBlockOperation)
Removes all StreamBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be removed, not the block being removed.
Attributes:
name str - name of the child block type to be removed(remove_struct_children_operation)=
class RemoveStructChildrenOperation(BaseBlockOperation)
Removes all StructBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StructBlock which contains the blocks to be removed, not the block being removed.
Attributes:
name str - name of the child block type to be removed(stream_children_to_list_block_operation)=
class StreamChildrenToListBlockOperation(BaseBlockOperation)
Combines StreamBlock children of the given type into a new ListBlock
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be combined, not the child block itself.
Attributes:
block_name str - name of the child block type to be combinedlist_block_name str - name of the new ListBlock type(stream_children_to_stream_block_operation)=
class StreamChildrenToStreamBlockOperation(BaseBlockOperation)
Combines StreamBlock children of the given types into a new StreamBlock
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be combined, not the child block itself.
Attributes:
block_names [str] - names of the child block types to be combinedstream_block_name str - name of the new StreamBlock type(alter_block_value_operation)=
class AlterBlockValueOperation(BaseBlockOperation)
Alters the value of each block to the given value
Attributes:
new_value: new value to change to(stream_children_to_struct_block_operation)=
class StreamChildrenToStructBlockOperation(BaseBlockOperation)
Move each StreamBlock child of the given type inside a new StructBlock
A new StructBlock will be created as a child of the parent StreamBlock for each child block of the given type, and then that child block will be moved from the parent StreamBlocks children inside the new StructBlock as a child of that StructBlock.
Example:
Consider the following StreamField definition:
mystream = StreamField([("char1", CharBlock()), ...], ...)
Then the stream data would look like the following:
[
...,
{ "type": "char1", "value": "Value1", ... },
{ "type": "char1", "value": "Value2", ... },
...
]
And if we define the operation like this:
StreamChildrenToStructBlockOperation("char1", "struct1")
Our altered stream data would look like this:
[
...,
{ "type": "struct1", "value": { "char1": "Value1" } },
{ "type": "struct1", "value": { "char1": "Value2" } },
...,
]
Notes:
block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be combined, not the child block itself.Attributes:
block_names str - names of the child block types to be combinedstruct_block_name str - name of the new StructBlock typeclass InvalidBlockDefError(Exception)
Exception for invalid block definitions
def map_block_value(block_value, block_def, block_path, operation, **kwargs)
Maps the value of a block.
Arguments:
block_value: The value of the block. This would be a list or dict of children for structural blocks.block_def: The definition of the block.block_path: A "." separated list of names of the blocks from the current block (not included) to the nested block of which the value will be passed to the operation.operation: An Operation class instance (extends BaseBlockOperation), which has an apply method for mapping values.Returns:
Transformed value
def map_struct_block_value(struct_block_value, block_def, block_path,
**kwargs)
Maps each child block in a StructBlock value.
Arguments:
stream_block_value: The value of the StructBlock, a dict of child blocksblock_def: The definition of the StructBlockblock_path: A "." separated list of names of the blocks from the current block (not included) to the nested block of which the value will be passed to the operation.Returns:
StructBlock after transforming its children.def map_list_block_value(list_block_value, block_def, block_path, **kwargs)
Maps each child block in a ListBlock value.
Arguments:
stream_block_value: The value of the ListBlock, a list of child blocksblock_def: The definition of the ListBlockblock_path: A "." separated list of names of the blocks from the current block (not included) to the nested block of which the value will be passed to the operation.Returns:
ListBlock after transforming all the children.def apply_changes_to_raw_data(raw_data, block_path_str, operation, streamfield,
**kwargs)
Applies changes to raw stream data
Arguments:
raw_data: The current stream data (a list of top level blocks)block_path_str: A "." separated list of names of the blocks from the top level block to the nested block of which the value will be passed to the operation.operation: A subclass of operations.BaseBlockOperation. It will have the apply method for applying changes to the matching block values.streamfield: The StreamField for which data is being migrated. This is used to get the definitions of the blocks.Returns:
altered_raw_data:
Operations for StreamField data migrations defined in wagtail.blocks.migrations require a "block path" to determine which blocks they should be applied to.
block_path = "" | block_name ("." block_name)*
block_name = str
A block path is either:
"." (period) separated sequence of block names, where block names are the names given to the blocks in the StreamField definition.Block names are the values associated with the "type" keys in the stream data's dictionary structures. As such, traversing or selecting ListBlock members requires the use of the "item" block name.
The value that an operation's apply method receives is the "value" member of the dict associated with the terminal block name in the block path.
For examples see the tutorial.