Skip to content

ValueObject field

Field descriptor for embedding value objects within aggregates or entities.

Bases: Field

Represents a field that holds a value object.

This field is used to embed a value object within an entity. It provides functionality to handle the value object's fields and their values.

PARAMETER DESCRIPTION
value_object_cls

The class of the value object to be embedded.

TYPE: class

ATTRIBUTE DESCRIPTION
embedded_fields

A dictionary that holds the embedded fields of the value object.

TYPE: dict

Source code in src/protean/fields/embedded.py
59
60
61
62
63
64
65
66
67
68
def __init__(self, value_object_cls, *args, **kwargs):
    super().__init__(*args, **kwargs)

    if not isinstance(value_object_cls, str):
        # Validate the class being passed is a subclass of BaseValueObject
        self._validate_value_object_cls(value_object_cls)

    self._value_object_cls = value_object_cls

    self._embedded_fields = {}

embedded_fields cached property

embedded_fields

Property to retrieve embedded fields

get_shadow_fields

get_shadow_fields()

Return shadow field Primarily used during Entity initialization to register shadow field

Source code in src/protean/fields/embedded.py
139
140
141
142
143
144
145
def get_shadow_fields(self):
    """Return shadow field
    Primarily used during Entity initialization to register shadow field"""
    shadow_fields = []
    for field in self.embedded_fields.values():
        shadow_fields.append((field.attribute_name, field))
    return shadow_fields

as_dict

as_dict(value)

Return JSON-compatible value of self

Source code in src/protean/fields/embedded.py
156
157
158
159
160
161
162
163
164
165
166
167
def as_dict(self, value):
    """Return JSON-compatible value of self"""
    return (
        {
            field_name: shadow_field_obj.field_obj.as_dict(
                getattr(value, field_name, None)
            )
            for field_name, shadow_field_obj in self.embedded_fields.items()
        }
        if value
        else None
    )

__set__

__set__(instance, value)

Override __set__ to coordinate between value object and its embedded fields

Source code in src/protean/fields/embedded.py
169
170
171
172
173
174
175
176
177
178
179
180
181
182
def __set__(self, instance, value):
    """Override `__set__` to coordinate between value object and its embedded fields"""
    value = self._load(value)

    if value:
        # Check if the reference object has been saved. Otherwise, throw ValueError
        self._set_own_value(instance, value)
        self._set_embedded_values(instance, value)
    else:
        self._reset_values(instance)

    # Mark Entity as Dirty
    if hasattr(instance, "state_"):
        instance.state_.mark_changed()