﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
36087	Add system check mentioning contrib.auth is not composite primary key ready	Jacob Walls		"It may not be likely someone would try this, but even so, we might add a system check or otherwise document that `contrib.auth` is not composite primary key ready. Then maybe we could refocus this ticket on adding support.

Adjusting a custom user model like this:

{{{#!diff
diff --git a/tests/auth_tests/models/custom_user.py b/tests/auth_tests/models/custom_user.py
index 4586e452cd..0647e47ede 100644
--- a/tests/auth_tests/models/custom_user.py
+++ b/tests/auth_tests/models/custom_user.py
@@ -52,6 +52,7 @@ class CustomUserManager(BaseUserManager):
 
 
 class CustomUser(AbstractBaseUser):
+    pk = models.CompositePrimaryKey(""email"", ""date_of_birth"")
     email = models.EmailField(verbose_name=""email address"", max_length=255, unique=True)
     is_active = models.BooleanField(default=True)
     is_admin = models.BooleanField(default=False)
}}}

Leads to various failures in contrib.auth that expect to deserialize a pk by decoding to a bytestring.

The failure I was playing with was a little easier to see by doing this:
{{{#!diff
diff --git a/django/contrib/auth/views.py b/django/contrib/auth/views.py
index a18cfdb347..4c82a4103c 100644
--- a/django/contrib/auth/views.py
+++ b/django/contrib/auth/views.py
@@ -304,7 +304,7 @@ class PasswordResetConfirmView(PasswordContextMixin, FormView):
             user = UserModel._default_manager.get(pk=uid)
         except (
             TypeError,
-            ValueError,
+            # ValueError,
             OverflowError,
             UserModel.DoesNotExist,
             ValidationError,
}}}

Then...
{{{
======================================================================
ERROR: test_confirm_valid_custom_user (auth_tests.test_views.CustomUserPasswordResetTest.test_confirm_valid_custom_user)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ""/Users/.../django/tests/auth_tests/test_views.py"", line 529, in test_confirm_valid_custom_user
    response = self.client.get(path)
               ^^^^^^^^^^^^^^^^^^^^^

...

File ""/Users/.../django/django/contrib/auth/views.py"", line 275, in dispatch
    self.user = self.get_user(kwargs[""uidb64""])
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ""/Users/.../django/django/contrib/auth/views.py"", line 304, in get_user
    user = UserModel._default_manager.get(pk=uid)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
...
  File ""/Users/.../django/django/db/models/lookups.py"", line 30, in __init__
    self.rhs = self.get_prep_lookup()
               ^^^^^^^^^^^^^^^^^^^^^^
  File ""/Users/.../django/django/db/models/fields/tuple_lookups.py"", line 36, in get_prep_lookup
    self.check_rhs_is_tuple_or_list()
  File ""/Users/.../django/django/db/models/fields/tuple_lookups.py"", line 45, in check_rhs_is_tuple_or_list
    raise ValueError(
ValueError: 'exact' lookup of 'pk' must be a tuple or a list

----------------------------------------------------------------------
Ran 2 tests in 0.056s

FAILED (errors=1)
}}}"	Cleanup/optimization	new	contrib.auth	dev	Normal				Unreviewed	0	0	0	0	0	0
