diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py
index 8b49808b7f144b4eb05be86d328b96ce64f84504..7551502e0910cc80940a72406f2c495a59469785 100644
--- a/api/funkwhale_api/music/factories.py
+++ b/api/funkwhale_api/music/factories.py
@@ -6,7 +6,7 @@ from funkwhale_api.factories import registry, NoUpdateOnCreate
 
 from funkwhale_api.federation import factories as federation_factories
 from funkwhale_api.music import licenses
-from funkwhale_api.tags import models as tags_models
+from funkwhale_api.tags import factories as tags_factories
 from funkwhale_api.users import factories as users_factories
 
 SAMPLES_PATH = os.path.join(
@@ -56,7 +56,9 @@ class LicenseFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
 
 
 @registry.register
-class ArtistFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+class ArtistFactory(
+    tags_factories.TaggableFactory, NoUpdateOnCreate, factory.django.DjangoModelFactory
+):
     name = factory.Faker("name")
     mbid = factory.Faker("uuid4")
     fid = factory.Faker("federation_url")
@@ -73,7 +75,9 @@ class ArtistFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
 
 
 @registry.register
-class AlbumFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+class AlbumFactory(
+    tags_factories.TaggableFactory, NoUpdateOnCreate, factory.django.DjangoModelFactory
+):
     title = factory.Faker("sentence", nb_words=3)
     mbid = factory.Faker("uuid4")
     release_date = factory.Faker("date_object")
@@ -97,7 +101,9 @@ class AlbumFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
 
 
 @registry.register
-class TrackFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+class TrackFactory(
+    tags_factories.TaggableFactory, NoUpdateOnCreate, factory.django.DjangoModelFactory
+):
     fid = factory.Faker("federation_url")
     title = factory.Faker("sentence", nb_words=3)
     mbid = factory.Faker("uuid4")
@@ -127,15 +133,6 @@ class TrackFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
             self.license = LicenseFactory(code=extracted)
             self.save()
 
-    @factory.post_generation
-    def set_tags(self, create, extracted, **kwargs):
-        if not create:
-            # Simple build, do nothing.
-            return
-
-        if extracted:
-            tags_models.set_tags(self, *extracted)
-
 
 @registry.register
 class UploadFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index 91fbb1b175fa4c6768d24704a2701bcfe19bb454..1c05319838d40c62de19eea157b7039cf585b2af 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -201,6 +201,8 @@ class Artist(APIModelMixin):
         on_delete=models.SET_NULL,
         related_name="attributed_artists",
     )
+    tagged_items = GenericRelation(tags_models.TaggedItem)
+
     api = musicbrainz.api.artists
     objects = ArtistQuerySet.as_manager()
 
@@ -279,6 +281,8 @@ class Album(APIModelMixin):
         on_delete=models.SET_NULL,
         related_name="attributed_albums",
     )
+    tagged_items = GenericRelation(tags_models.TaggedItem)
+
     api_includes = ["artist-credits", "recordings", "media", "release-groups"]
     api = musicbrainz.api.releases
     federation_namespace = "albums"
diff --git a/api/funkwhale_api/tags/factories.py b/api/funkwhale_api/tags/factories.py
index 9a9d2f216fcf1262c7a39a775cd9f3ac6ac48b0a..c0ba5cac6f19c75f16846612326a5b4ec658a2fb 100644
--- a/api/funkwhale_api/tags/factories.py
+++ b/api/funkwhale_api/tags/factories.py
@@ -2,6 +2,8 @@ import factory
 
 from funkwhale_api.factories import registry, NoUpdateOnCreate
 
+from . import models
+
 
 @registry.register
 class TagFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
@@ -18,3 +20,14 @@ class TaggedItemFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
 
     class Meta:
         model = "tags.TaggedItem"
+
+
+class TaggableFactory(factory.django.DjangoModelFactory):
+    @factory.post_generation
+    def set_tags(self, create, extracted, **kwargs):
+        if not create:
+            # Simple build, do nothing.
+            return
+
+        if extracted:
+            models.set_tags(self, *extracted)
diff --git a/api/tests/tags/test_models.py b/api/tests/tags/test_models.py
index 1a3a075fcebd50f77a945518ab01cd39bc60c106..2bc451a1145054758807e746ec9247f5f6a146ba 100644
--- a/api/tests/tags/test_models.py
+++ b/api/tests/tags/test_models.py
@@ -51,3 +51,11 @@ def test_set_tags(factories, existing, given, expected):
     for tag in expected:
         match = tagged_items.get(tag__name=tag)
         assert match.content_object == obj
+
+
+@pytest.mark.parametrize("factory_name", ["music.Track", "music.Album", "music.Artist"])
+def test_models_that_support_tags(factories, factory_name):
+    tags = ["tag1", "tag2"]
+    obj = factories[factory_name](set_tags=tags)
+
+    assert sorted(obj.tagged_items.all().values_list("tag__name", flat=True)) == tags