Сохранение вложенных объектов в Django из словаря
У меня есть небольшая проблема с повторением при создании вложенных связанных объектов.
Я получаю JSON от вызова API, который я конвертирую во вложенный словарь.
В этом вложенном дикте есть много связанных объектов, которые я должен проверить, есть ли в их полях related_model
, чтобы создать связанный объект до создания фактического объекта...
У меня есть 3 одинаковые функции, но с разными именами:
- get_or_create_object
- get_or_create_related_object
- get_or_create_subrelated_object
Вот код:
def get_or_create_object(object_dict:dict, Klass):
# Main object
just_fields_dict = object_dict
just_related_objects_dict = {}
for key in object_dict.copy().keys():
key = _validate_field_name(key)
related_model = getattr(Klass, key).field.related_model
if related_model:
if isinstance(object_dict[key], list):
print(object_dict[key])
else:
value = _clean_object_dict(object_dict[key])
obj = get_or_create_related_object(object_dict=value, Klass=related_model)
just_related_objects_dict[key] = obj
just_fields_dict.pop(key, None)
composed_object_dict = {**just_fields_dict, **just_related_objects_dict}
obj, _ = Klass.objects.get_or_create(**composed_object_dict)
return obj
def get_or_create_related_object(Klass, object_dict):
# Related object to main object
just_fields_dict = object_dict
just_related_objects_dict = {}
for key in object_dict.copy().keys():
related_model = getattr(Klass, key).field.related_model
if related_model:
object_dict = _clean_object_dict(object_dict[key])
obj = get_or_create_subrelated_object(
Klass=related_model,
object_dict=object_dict
)
just_related_objects_dict[key] = obj
just_fields_dict.pop(key, None)
composed_object_dict = {**just_fields_dict, **just_related_objects_dict}
obj, _ = Klass.objects.get_or_create(**composed_object_dict)
return obj
def get_or_create_subrelated_object(Klass, object_dict):
# Related object to "Related object to main object"
# In other words: subrelated object
just_fields_dict = object_dict
just_related_objects_dict = {}
for key in object_dict.copy().keys():
related_model = getattr(Klass, key).field.related_model
if related_model:
object_dict = _clean_object_dict(object_dict[key])
just_related_objects_dict[key] = obj
just_fields_dict.pop(key, None)
obj = get_or_create_related_object(Klass=related_model, object_dict=object_dict )
composed_object_dict = {**just_fields_dict, **just_related_objects_dict}
obj, _ = Klass.objects.get_or_create(**composed_object_dict)
return obj
У кого-нибудь есть лучший подход?
Большое спасибо!
Я проверил документацию, но там только простые примеры.