diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 2f454e1246..f5e69ab6a7 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -835,20 +835,13 @@ def create_many_to_many_intermediary_model(field, klass):
         'db_table': field._get_m2m_db_table(klass._meta),
         'managed': managed,
         'auto_created': klass,
+        'app_label': klass._meta.app_label,
         'unique_together': (from_, to)
     })
-    # If the models have been split into subpackages, klass.__module__
-    # will be the subpackge, not the models module for the app. (See #12168)
-    # Compose the actual models module name by stripping the trailing parts
-    # of the namespace until we find .models
-    parts = klass.__module__.split('.')
-    while parts[-1] != 'models':
-        parts.pop()
-    module = '.'.join(parts)
     # Construct and return the new class.
     return type(name, (models.Model,), {
         'Meta': meta,
-        '__module__': module,
+        '__module__': klass.__module__,
         from_: models.ForeignKey(klass, related_name='%s+' % name),
         to: models.ForeignKey(to_model, related_name='%s+' % name)
     })
diff --git a/tests/modeltests/model_package/tests.py b/tests/modeltests/model_package/tests.py
index 6e8c158a68..7fd4b6f679 100644
--- a/tests/modeltests/model_package/tests.py
+++ b/tests/modeltests/model_package/tests.py
@@ -1,4 +1,13 @@
-"""
+from django.db import models
+
+class Advertisment(models.Model):
+    customer = models.CharField(max_length=100)
+    publications = models.ManyToManyField("model_package.Publication", null=True, blank=True)
+
+    class Meta:
+        app_label = 'model_package'
+
+__test__ = {'API_TESTS': """
 >>> from models.publication import Publication
 >>> from models.article import Article
 >>> from django.contrib.auth.views import Site
@@ -19,7 +28,6 @@
 >>> a.save()
 >>> a.publications.add(p)
 >>> a.sites.add(current_site)
->>> a.save()
 
 >>> a = Article.objects.get(id=1)
 >>> a
@@ -29,6 +37,19 @@
 >>> a.sites.count()
 1
 
-"""
+# Regression for #12248 - Models can exist in the test package, too
+
+>>> ad = Advertisment(customer="Lawrence Journal-World")
+>>> ad.save()
+>>> ad.publications.add(p)
+
+>>> ad = Advertisment.objects.get(id=1)
+>>> ad
+<Advertisment: Advertisment object>
+
+>>> ad.publications.count()
+1
+
+"""}