Skip to content

19 model

Zuko edited this page Jan 21, 2026 · 1 revision

Model - Data Models

Base models và mixins cho data tracking

BaseAttributeModel

Base model với attribute access:

from core.model import BaseAttributeModel

class UserModel(BaseAttributeModel):
    def __init__(self, data: dict):
        super().__init__(data)
    
    @property
    def name(self):
        return self.get('name')
    
    @property
    def email(self):
        return self.get('email')

# Usage
user = UserModel({'name': 'John', 'email': 'john@example.com'})
print(user.name)  # 'John'
print(user.email)  # 'john@example.com'

DataTrackingMixin

Track data changes:

from core.model import DataTrackingMixin

class TrackedModel(DataTrackingMixin):
    def __init__(self):
        super().__init__()
        self.data = {}
    
    def updateData(self, key, value):
        self._trackChange(key, value)
        self.data[key] = value

# Usage
model = TrackedModel()
model.updateData('name', 'John')
model.updateData('name', 'Jane')

changes = model.getChanges()
print(changes)  # History of changes

Usage Examples

User Model

from core.model import BaseAttributeModel

class User(BaseAttributeModel):
    @property
    def id(self):
        return self.get('id')
    
    @property
    def username(self):
        return self.get('username')
    
    @property
    def isActive(self):
        return self.get('is_active', default=False)

# Create from API response
userData = {'id': 123, 'username': 'john', 'is_active': True}
user = User(userData)

print(user.id)  # 123
print(user.username)  # 'john'
print(user.isActive)  # True

Tracked Configuration

from core.model import DataTrackingMixin

class AppConfig(DataTrackingMixin):
    def __init__(self):
        super().__init__()
        self.settings = {}
    
    def setSetting(self, key, value):
        oldValue = self.settings.get(key)
        self._trackChange(key, oldValue, value)
        self.settings[key] = value
    
    def getSetting(self, key, default=None):
        return self.settings.get(key, default)

# Usage
config = AppConfig()
config.setSetting('theme', 'light')
config.setSetting('theme', 'dark')

# Get change history
changes = config.getChanges()

Best Practices

✅ DO

# Use BaseAttributeModel for API responses
class ApiResponse(BaseAttributeModel):
    @property
    def status(self):
        return self.get('status')

# Use DataTrackingMixin for audit trails
class AuditedModel(DataTrackingMixin):
    def update(self, key, value):
        self._trackChange(key, value)

❌ DON'T

# Don't access dict directly
class User(BaseAttributeModel):
    @property
    def name(self):
        return self._data['name']  # Use self.get('name')

Related Documentation

Clone this wiki locally