Files
drf-rack/net/xeaf/rack/utils/model_utils.py

71 lines
2.3 KiB
Python

# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса ModelUtils
"""
from typing import Any
from django.db.models import Model
from django.forms import model_to_dict
class ModelUtils:
"""
Реализует служебные функции работы с моделями данных
"""
@classmethod
def concat_data(cls, data: dict[str | int, Any] | Model, target: dict[str | int, Any], ) -> None:
"""
Объединяет данные
:param data: Источник данных
:param target: Приемник
"""
# Получаем объект данных
if isinstance(data, Model):
source = model_to_dict(data)
if 'id' in source and source['id'] is None:
del source['id']
else:
source = data
# noinspection PyUnresolvedReferences
for key, value in source.items():
if key not in target:
target[key] = value
@classmethod
def update_data(cls, instance: dict[str, Any] | Model, validated_data: dict[str, Any]) -> None:
"""
Обновляет данные объекта
:param instance: Объект
:param validated_data: Данные для обновления
"""
# Для модели и словаря набор полей строится по-разному
if isinstance(instance, Model):
is_model = True
fields = [field.name for field in instance._meta.get_fields()]
elif isinstance(instance, dict):
is_model = False
fields = instance.keys()
else:
raise TypeError('Instance must be a Model or dict')
# Назначаем только существующие поля
for attr, value in validated_data.items():
if attr in fields:
if is_model:
setattr(instance, attr, value)
else:
# noinspection unresolved-references
instance[attr] = value