Nautobot Primary Key Generation Flowchart¶
Here's a flowchart showing how primary keys are generated in the Nautobot importer, starting with get_pk_from_data:
flowchart TD
    start("get_pk_from_data(data)")
    customFunc{"Custom\nget_pk_from_data_hook\nexists?"}
    useCustomFunc["Use custom function\nto generate PK"]
    checkIdentifiers{"Are identifiers\ndefined?"}
    usePkField["Use data[pk_field.name]\nas UID"]
    checkDataUidCache{"Is data UID\nin cache?"}
    returnCachedUid["Return cached UID"]
    getFromIdentifiers["Get PK from identifiers"]
    cacheResult["Cache result"]
    returnResult["Return result"]
    getPkFromIdentifiers["get_pk_from_identifiers(data)"]
    identifiersInCache{"Are identifiers\nin cache?"}
    returnIdentifiersCache["Return cached value"]
    tryNautobot["Try to get instance\nfrom Nautobot"]
    nautonotExists{"Instance\nexists?"}
    useNautobotUid["Use Nautobot UID"]
    fallbackUid["Fall back to get_pk_from_uid()"]
    getPkFromUid["get_pk_from_uid(uid)"]
    uidInCache{"Is UID in cache?"}
    returnUidCache["Return cached value"]
    checkFieldType{"What is\nPK field type?"}
    useUuid["Generate UUID from\nsource_pk_to_uuid()"]
    useAutoIncrement["Increment counter\nand use as PK"]
    unsupportedType["Raise error:\nUnsupported type"]
    cacheUid["Cache UID mapping"]
    start --> customFunc
    customFunc -->|Yes| useCustomFunc --> returnResult
    customFunc -->|No| checkIdentifiers
    checkIdentifiers -->|No| usePkField --> getPkFromUid
    checkIdentifiers -->|Yes| checkDataUidCache
    checkDataUidCache -->|Yes| returnCachedUid --> returnResult
    checkDataUidCache -->|No| getFromIdentifiers
    getFromIdentifiers --> getPkFromIdentifiers
    getPkFromIdentifiers --> identifiersInCache
    identifiersInCache -->|Yes| returnIdentifiersCache --> cacheResult
    identifiersInCache -->|No| tryNautobot --> nautonotExists
    nautonotExists -->|Yes| useNautobotUid --> cacheResult
    nautonotExists -->|No| fallbackUid --> getPkFromUid
    getPkFromUid --> uidInCache
    uidInCache -->|Yes| returnUidCache --> returnResult
    uidInCache -->|No| checkFieldType
    checkFieldType -->|UUID| useUuid --> cacheUid
    checkFieldType -->|Auto increment| useAutoIncrement --> cacheUid
    checkFieldType -->|Other| unsupportedType
    cacheUid --> returnResult
    cacheResult --> returnResultThis flowchart shows:
- How the process starts by checking for a custom function
- The branching logic based on whether identifiers are defined
- Multiple caching points to avoid redundant lookups
- How the system looks for existing Nautobot instances
- How different field types (UUID vs auto-increment) are handled differently
- The final caching and return of the result
The process ensures each record gets a consistent primary key that can be reliably referenced throughout the import process.