71 lines
2.3 KiB
Python
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
|