Сохранение вложенных объектов в 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

У кого-нибудь есть лучший подход?

Большое спасибо!

Я проверил документацию, но там только простые примеры.

Вернуться на верх