# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: 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