Foreign Keys

Following Foreign Keys

The osu! api often returns models which contain an id which references another model. For instance, Beatmap.beatmapset_id references the id of the Beatmapset model. This is a similar concept to foreign keys in databases.

Where applicable, ossapi provides methods to “follow” these ids and retrieve the full model from the id:

beatmap = api.beatmap(221777)
bmset = beatmap.beatmapset()

You can do the same for user() and beatmap(), in applicable models:

disc = api.beatmapset_discussion_posts(2641058).posts[0]
user = disc.user()

bm_playcount = api.user_beatmaps(user_id=12092800, type="most_played")[0]
beatmap = bm_playcount.beatmap()

Note

Following a foreign key usually involves an api call, so it is not free.

Other Foreign Keys

Note that the id attribute and corresponding method isn’t always called beatmap, beatmapset, or user. For instance, BeatmapsetDiscussionPost has the attributes last_editor_id and deleted_by_id, referencing the users who last edited and deleted the discussion respectively.

In line with this, BeatmapsetDiscussionPost defines the methods last_editor and deleted_by to retrieve the full user objects:

disc = api.beatmapset_discussion_posts(2641058).posts[0]
last_editor = disc.last_editor()
deleted_by = disc.deleted_by()
print(last_editor.username, deleted_by)

Models with similar attributes also define similar methods. The functions are almost always named by dropping _id from the attribute name.