diff --git a/django/contrib/contenttypes/views.py b/django/contrib/contenttypes/views.py
index bfde73c567..fac15df107 100644
--- a/django/contrib/contenttypes/views.py
+++ b/django/contrib/contenttypes/views.py
@@ -1,7 +1,7 @@
from django.apps import apps
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.shortcuts import get_current_site
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.http import Http404, HttpResponseRedirect
from django.utils.translation import gettext as _
@@ -19,7 +19,7 @@ def shortcut(request, content_type_id, object_id):
% {"ct_id": content_type_id}
)
obj = content_type.get_object_for_this_type(pk=object_id)
- except (ObjectDoesNotExist, ValueError):
+ except (ObjectDoesNotExist, ValidationError, ValueError):
raise Http404(
_("Content type %(ct_id)s object %(obj_id)s doesn’t exist")
% {"ct_id": content_type_id, "obj_id": object_id}
diff --git a/django/forms/models.py b/django/forms/models.py
index 8084e16c8d..8ccca3c195 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -1562,7 +1562,12 @@ def to_python(self, value):
if isinstance(value, self.queryset.model):
value = getattr(value, key)
value = self.queryset.get(**{key: value})
- except (ValueError, TypeError, self.queryset.model.DoesNotExist):
+ except (
+ ValueError,
+ TypeError,
+ ValidationError,
+ self.queryset.model.DoesNotExist,
+ ):
raise ValidationError(
self.error_messages["invalid_choice"],
code="invalid_choice",
@@ -1640,7 +1645,7 @@ def _check_values(self, value):
self.validate_no_null_characters(pk)
try:
self.queryset.filter(**{key: pk})
- except (ValueError, TypeError):
+ except (ValueError, TypeError, ValidationError):
raise ValidationError(
self.error_messages["invalid_pk_value"],
code="invalid_pk_value",
diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py
index 6365109a91..c1039fd9c5 100644
--- a/tests/admin_changelist/tests.py
+++ b/tests/admin_changelist/tests.py
@@ -875,7 +875,7 @@ def test_no_distinct_for_m2m_in_list_filter_without_params(self):
self.assertIs(cl.queryset.query.distinct, False)
# A ManyToManyField in params does have distinct applied.
- request = self.factory.get("/band/", {"genres": "0"})
+ request = self.factory.get("/band/", {"genres": "000000000000000000000000"})
request.user = self.superuser
cl = m.get_changelist_instance(request)
self.assertIs(cl.queryset.query.distinct, True)
@@ -993,14 +993,19 @@ def test_dynamic_list_display_links(self):
"""
parent = Parent.objects.create(name="parent")
for i in range(1, 10):
- Child.objects.create(id=i, name="child %s" % i, parent=parent, age=i)
+ Child.objects.create(
+ id=f"{i:024}",
+ name="child %s" % i,
+ parent=parent,
+ age=i,
+ )
m = DynamicListDisplayLinksChildAdmin(Child, custom_site)
superuser = self._create_superuser("superuser")
request = self._mocked_authenticated_request("/child/", superuser)
response = m.changelist_view(request)
for i in range(1, 10):
- link = reverse("admin:admin_changelist_child_change", args=(i,))
+ link = reverse("admin:admin_changelist_child_change", args=(f"{i:024}",))
self.assertContains(response, '%s' % (link, i))
list_display = m.get_list_display(request)
@@ -1277,7 +1282,7 @@ def test_deterministic_order_for_unordered_model(self):
superuser = self._create_superuser("superuser")
for counter in range(1, 51):
- UnorderedObject.objects.create(id=counter, bool=True)
+ UnorderedObject.objects.create(id=f"{counter:024}", bool=True)
class UnorderedObjectAdmin(admin.ModelAdmin):
list_per_page = 10
@@ -1293,7 +1298,7 @@ def check_results_order(ascending=False):
response = model_admin.changelist_view(request)
for result in response.context_data["cl"].result_list:
counter += 1 if ascending else -1
- self.assertEqual(result.id, counter)
+ self.assertEqual(str(result.id), f"{counter:024}")
custom_site.unregister(UnorderedObject)
# When no order is defined at all, everything is ordered by '-pk'.
@@ -1323,7 +1328,7 @@ def test_deterministic_order_for_model_ordered_by_its_manager(self):
superuser = self._create_superuser("superuser")
for counter in range(1, 51):
- OrderedObject.objects.create(id=counter, bool=True, number=counter)
+ OrderedObject.objects.create(id=f"{counter:024}", bool=True, number=counter)
class OrderedObjectAdmin(admin.ModelAdmin):
list_per_page = 10
@@ -1339,7 +1344,7 @@ def check_results_order(ascending=False):
response = model_admin.changelist_view(request)
for result in response.context_data["cl"].result_list:
counter += 1 if ascending else -1
- self.assertEqual(result.id, counter)
+ self.assertEqual(str(result.id), f"{counter:024}")
custom_site.unregister(OrderedObject)
# When no order is defined at all, use the model's default ordering
diff --git a/tests/admin_checks/tests.py b/tests/admin_checks/tests.py
index 6ca5d6d925..c696ad57c1 100644
--- a/tests/admin_checks/tests.py
+++ b/tests/admin_checks/tests.py
@@ -77,7 +77,7 @@ def test_checks_are_performed(self):
try:
errors = checks.run_checks()
expected = ["error!"]
- self.assertEqual(errors, expected)
+ self.assertEqual(errors[1:], expected)
finally:
admin.site.unregister(Song)
@@ -268,7 +268,7 @@ class CustomAdminSite(admin.AdminSite):
try:
errors = checks.run_checks()
expected = ["error!"]
- self.assertEqual(errors, expected)
+ self.assertEqual(errors[1:], expected)
finally:
custom_site.unregister(Song)
diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py
index 5cc40cb7b0..82a74e8035 100644
--- a/tests/admin_inlines/tests.py
+++ b/tests/admin_inlines/tests.py
@@ -501,8 +501,10 @@ def test_localize_pk_shortcut(self):
The "View on Site" link is correct for locales that use thousand
separators.
"""
- holder = Holder.objects.create(pk=123456789, dummy=42)
- inner = Inner.objects.create(pk=987654321, holder=holder, dummy=42, readonly="")
+ holder = Holder.objects.create(pk="000000000000000123456789", dummy=42)
+ inner = Inner.objects.create(
+ pk="000000000000000987654321", holder=holder, dummy=42, readonly=""
+ )
response = self.client.get(
reverse("admin:admin_inlines_holder_change", args=(holder.id,))
)
@@ -936,7 +938,7 @@ def setUpTestData(cls):
)
cls.user.user_permissions.add(permission)
- author = Author.objects.create(pk=1, name="The Author")
+ author = Author.objects.create(pk="000000000000000000000001", name="The Author")
cls.book = author.books.create(name="The inline Book")
cls.author_change_url = reverse(
"admin:admin_inlines_author_change", args=(author.id,)
diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py
index 566ee96a30..312ad314d8 100644
--- a/tests/admin_views/admin.py
+++ b/tests/admin_views/admin.py
@@ -288,11 +288,13 @@ def has_module_permission(self, request):
class RowLevelChangePermissionModelAdmin(admin.ModelAdmin):
def has_change_permission(self, request, obj=None):
"""Only allow changing objects with even id number"""
- return request.user.is_staff and (obj is not None) and (obj.id % 2 == 0)
+ return (
+ request.user.is_staff and (obj is not None) and (int(str(obj.id)) % 2 == 0)
+ )
def has_view_permission(self, request, obj=None):
"""Only allow viewing objects if id is a multiple of 3."""
- return request.user.is_staff and obj is not None and obj.id % 3 == 0
+ return request.user.is_staff and obj is not None and int(str(obj.id)) % 3 == 0
class CustomArticleAdmin(admin.ModelAdmin):
@@ -467,7 +469,7 @@ def save_related(self, request, form, formsets, change):
class EmptyModelAdmin(admin.ModelAdmin):
def get_queryset(self, request):
- return super().get_queryset(request).filter(pk__gt=1)
+ return super().get_queryset(request).filter(pk__gt="000000000000000000000001")
class OldSubscriberAdmin(admin.ModelAdmin):
@@ -644,7 +646,9 @@ class FieldOverridePostAdmin(PostAdmin):
class CustomChangeList(ChangeList):
def get_queryset(self, request):
- return self.root_queryset.order_by("pk").filter(pk=9999) # Doesn't exist
+ return self.root_queryset.order_by("pk").filter(
+ pk="000000000000000000000000"
+ ) # Doesn't exist
class GadgetAdmin(admin.ModelAdmin):
diff --git a/tests/admin_views/models.py b/tests/admin_views/models.py
index b7691d0449..bd460eca35 100644
--- a/tests/admin_views/models.py
+++ b/tests/admin_views/models.py
@@ -940,7 +940,7 @@ def get_queryset(self):
class FilteredManager(models.Model):
def __str__(self):
- return "PK=%d" % self.pk
+ return "PK=%s" % self.pk
pk_gt_1 = _Manager()
objects = models.Manager()
diff --git a/tests/admin_views/test_actions.py b/tests/admin_views/test_actions.py
index dbd372e27d..3085465af7 100644
--- a/tests/admin_views/test_actions.py
+++ b/tests/admin_views/test_actions.py
@@ -89,9 +89,11 @@ def test_model_admin_default_delete_action(self):
self.assertEqual(Subscriber.objects.count(), 0)
def test_default_delete_action_nonexistent_pk(self):
- self.assertFalse(Subscriber.objects.filter(id=9998).exists())
+ self.assertFalse(
+ Subscriber.objects.filter(id="000000000000000000009998").exists()
+ )
action_data = {
- ACTION_CHECKBOX_NAME: ["9998"],
+ ACTION_CHECKBOX_NAME: ["000000000000000000009998"],
"action": "delete_selected",
"index": 0,
}
@@ -109,7 +111,7 @@ def test_non_localized_pk(self):
If USE_THOUSAND_SEPARATOR is set, the ids for the objects selected for
deletion are rendered without separators.
"""
- s = ExternalSubscriber.objects.create(id=9999)
+ s = ExternalSubscriber.objects.create(id="000000000000000000009999")
action_data = {
ACTION_CHECKBOX_NAME: [s.pk, self.s2.pk],
"action": "delete_selected",
@@ -119,7 +121,7 @@ def test_non_localized_pk(self):
reverse("admin:admin_views_subscriber_changelist"), action_data
)
self.assertTemplateUsed(response, "admin/delete_selected_confirmation.html")
- self.assertContains(response, 'value="9999"') # Instead of 9,999
+ self.assertContains(response, 'value="000000000000000000009999"')
self.assertContains(response, 'value="%s"' % self.s2.pk)
def test_model_admin_default_delete_action_protected(self):
diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py
index 246e95c58e..8dda0c8cec 100644
--- a/tests/admin_views/tests.py
+++ b/tests/admin_views/tests.py
@@ -1714,7 +1714,7 @@ def test_custom_model_admin_templates(self):
data={
"index": 0,
"action": ["delete_selected"],
- "_selected_action": ["1"],
+ "_selected_action": [str(article_pk)],
},
)
self.assertTemplateUsed(
@@ -2713,10 +2713,18 @@ def test_change_view(self):
self.client.post(reverse("admin:logout"))
# Test redirection when using row-level change permissions. Refs #11513.
- r1 = RowLevelChangePermissionModel.objects.create(id=1, name="odd id")
- r2 = RowLevelChangePermissionModel.objects.create(id=2, name="even id")
- r3 = RowLevelChangePermissionModel.objects.create(id=3, name="odd id mult 3")
- r6 = RowLevelChangePermissionModel.objects.create(id=6, name="even id mult 3")
+ r1 = RowLevelChangePermissionModel.objects.create(
+ id="000000000000000000000001", name="odd id"
+ )
+ r2 = RowLevelChangePermissionModel.objects.create(
+ id="000000000000000000000002", name="even id"
+ )
+ r3 = RowLevelChangePermissionModel.objects.create(
+ id="000000000000000000000003", name="odd id mult 3"
+ )
+ r6 = RowLevelChangePermissionModel.objects.create(
+ id="000000000000000000000006", name="even id mult 3"
+ )
change_url_1 = reverse(
"admin:admin_views_rowlevelchangepermissionmodel_change", args=(r1.pk,)
)
@@ -2743,14 +2751,20 @@ def test_change_view(self):
self.assertEqual(response.status_code, 403)
response = self.client.post(change_url_1, {"name": "changed"})
self.assertEqual(
- RowLevelChangePermissionModel.objects.get(id=1).name, "odd id"
+ RowLevelChangePermissionModel.objects.get(
+ id="000000000000000000000001"
+ ).name,
+ "odd id",
)
self.assertEqual(response.status_code, 403)
response = self.client.get(change_url_2)
self.assertEqual(response.status_code, 200)
response = self.client.post(change_url_2, {"name": "changed"})
self.assertEqual(
- RowLevelChangePermissionModel.objects.get(id=2).name, "changed"
+ RowLevelChangePermissionModel.objects.get(
+ id="000000000000000000000002"
+ ).name,
+ "changed",
)
self.assertRedirects(response, self.index_url)
response = self.client.get(change_url_3)
@@ -2758,14 +2772,19 @@ def test_change_view(self):
response = self.client.post(change_url_3, {"name": "changed"})
self.assertEqual(response.status_code, 403)
self.assertEqual(
- RowLevelChangePermissionModel.objects.get(id=3).name,
+ RowLevelChangePermissionModel.objects.get(
+ id="000000000000000000000003"
+ ).name,
"odd id mult 3",
)
response = self.client.get(change_url_6)
self.assertEqual(response.status_code, 200)
response = self.client.post(change_url_6, {"name": "changed"})
self.assertEqual(
- RowLevelChangePermissionModel.objects.get(id=6).name, "changed"
+ RowLevelChangePermissionModel.objects.get(
+ id="000000000000000000000006"
+ ).name,
+ "changed",
)
self.assertRedirects(response, self.index_url)
@@ -2780,7 +2799,10 @@ def test_change_view(self):
change_url_1, {"name": "changed"}, follow=True
)
self.assertEqual(
- RowLevelChangePermissionModel.objects.get(id=1).name, "odd id"
+ RowLevelChangePermissionModel.objects.get(
+ id="000000000000000000000001"
+ ).name,
+ "odd id",
)
self.assertContains(response, "login-form")
response = self.client.get(change_url_2, follow=True)
@@ -2789,7 +2811,10 @@ def test_change_view(self):
change_url_2, {"name": "changed again"}, follow=True
)
self.assertEqual(
- RowLevelChangePermissionModel.objects.get(id=2).name, "changed"
+ RowLevelChangePermissionModel.objects.get(
+ id="000000000000000000000002"
+ ).name,
+ "changed",
)
self.assertContains(response, "login-form")
self.client.post(reverse("admin:logout"))
@@ -3084,8 +3109,12 @@ def test_history_view(self):
self.assertEqual(response.status_code, 200)
# Test redirection when using row-level change permissions. Refs #11513.
- rl1 = RowLevelChangePermissionModel.objects.create(id=1, name="odd id")
- rl2 = RowLevelChangePermissionModel.objects.create(id=2, name="even id")
+ rl1 = RowLevelChangePermissionModel.objects.create(
+ id="000000000000000000000001", name="odd id"
+ )
+ rl2 = RowLevelChangePermissionModel.objects.create(
+ id="000000000000000000000002", name="even id"
+ )
logins = [
self.superuser,
self.viewuser,
@@ -3566,8 +3595,12 @@ def setUpTestData(cls):
cls.ssh1 = SuperSecretHideout.objects.create(
location="super floating castle!", supervillain=cls.sv1
)
- cls.cy1 = CyclicOne.objects.create(pk=1, name="I am recursive", two_id=1)
- cls.cy2 = CyclicTwo.objects.create(pk=1, name="I am recursive too", one_id=1)
+ cls.cy1 = CyclicOne.objects.create(
+ pk="000000000000000000000001", name="I am recursive", two_id=1
+ )
+ cls.cy2 = CyclicTwo.objects.create(
+ pk="000000000000000000000001", name="I am recursive too", one_id=1
+ )
def setUp(self):
self.client.force_login(self.superuser)
@@ -4429,12 +4462,22 @@ def test_non_form_errors_is_errorlist(self):
)
def test_list_editable_ordering(self):
- collector = Collector.objects.create(id=1, name="Frederick Clegg")
+ collector = Collector.objects.create(
+ id="000000000000000000000001", name="Frederick Clegg"
+ )
- Category.objects.create(id=1, order=1, collector=collector)
- Category.objects.create(id=2, order=2, collector=collector)
- Category.objects.create(id=3, order=0, collector=collector)
- Category.objects.create(id=4, order=0, collector=collector)
+ Category.objects.create(
+ id="000000000000000000000001", order=1, collector=collector
+ )
+ Category.objects.create(
+ id="000000000000000000000002", order=2, collector=collector
+ )
+ Category.objects.create(
+ id="000000000000000000000003", order=0, collector=collector
+ )
+ Category.objects.create(
+ id="000000000000000000000004", order=0, collector=collector
+ )
# NB: The order values must be changed so that the items are reordered.
data = {
@@ -4442,16 +4485,16 @@ def test_list_editable_ordering(self):
"form-INITIAL_FORMS": "4",
"form-MAX_NUM_FORMS": "0",
"form-0-order": "14",
- "form-0-id": "1",
+ "form-0-id": "000000000000000000000001",
"form-0-collector": "1",
"form-1-order": "13",
- "form-1-id": "2",
+ "form-1-id": "000000000000000000000002",
"form-1-collector": "1",
"form-2-order": "1",
- "form-2-id": "3",
+ "form-2-id": "000000000000000000000003",
"form-2-collector": "1",
"form-3-order": "0",
- "form-3-id": "4",
+ "form-3-id": "000000000000000000000004",
"form-3-collector": "1",
# The form processing understands this as a list_editable "Save"
# and not an action "Go".
@@ -4464,18 +4507,24 @@ def test_list_editable_ordering(self):
self.assertEqual(response.status_code, 302)
# The order values have been applied to the right objects
- self.assertEqual(Category.objects.get(id=1).order, 14)
- self.assertEqual(Category.objects.get(id=2).order, 13)
- self.assertEqual(Category.objects.get(id=3).order, 1)
- self.assertEqual(Category.objects.get(id=4).order, 0)
+ self.assertEqual(Category.objects.get(id="000000000000000000000001").order, 14)
+ self.assertEqual(Category.objects.get(id="000000000000000000000002").order, 13)
+ self.assertEqual(Category.objects.get(id="000000000000000000000003").order, 1)
+ self.assertEqual(Category.objects.get(id="000000000000000000000004").order, 0)
def test_list_editable_pagination(self):
"""
Pagination works for list_editable items.
"""
- UnorderedObject.objects.create(id=1, name="Unordered object #1")
- UnorderedObject.objects.create(id=2, name="Unordered object #2")
- UnorderedObject.objects.create(id=3, name="Unordered object #3")
+ UnorderedObject.objects.create(
+ id="000000000000000000000001", name="Unordered object #1"
+ )
+ UnorderedObject.objects.create(
+ id="000000000000000000000002", name="Unordered object #2"
+ )
+ UnorderedObject.objects.create(
+ id="000000000000000000000003", name="Unordered object #3"
+ )
response = self.client.get(
reverse("admin:admin_views_unorderedobject_changelist")
)
@@ -4932,7 +4981,7 @@ def setUpTestData(cls):
cls.superuser = User.objects.create_superuser(
username="super", password="secret", email="super@example.com"
)
- cls.pks = [EmptyModel.objects.create(id=i + 1).id for i in range(3)]
+ cls.pks = [EmptyModel.objects.create(id=f"{i+1:024}").id for i in range(3)]
def setUp(self):
self.client.force_login(self.superuser)
@@ -4945,7 +4994,7 @@ def setUp(self):
def test_changelist_view(self):
response = self.client.get(reverse("admin:admin_views_emptymodel_changelist"))
for i in self.pks:
- if i > 1:
+ if str(i) > "000000000000000000000001":
self.assertContains(response, "Primary key = %s" % i)
else:
self.assertNotContains(response, "Primary key = %s" % i)
@@ -4982,13 +5031,16 @@ def test_change_view(self):
for i in self.pks:
url = reverse("admin:admin_views_emptymodel_change", args=(i,))
response = self.client.get(url, follow=True)
- if i > 1:
+ if str(i) > "000000000000000000000001":
self.assertEqual(response.status_code, 200)
else:
self.assertRedirects(response, reverse("admin:index"))
self.assertEqual(
[m.message for m in response.context["messages"]],
- ["empty model with ID “1” doesn’t exist. Perhaps it was deleted?"],
+ [
+ "empty model with ID “000000000000000000000001” doesn’t "
+ "exist. Perhaps it was deleted?"
+ ],
)
def test_add_model_modeladmin_defer_qs(self):
@@ -5206,22 +5258,28 @@ def test_history_view_custom_qs(self):
Custom querysets are considered for the admin history view.
"""
self.client.post(reverse("admin:login"), self.super_login)
- FilteredManager.objects.create(pk=1)
- FilteredManager.objects.create(pk=2)
+ FilteredManager.objects.create(pk="000000000000000000000001")
+ FilteredManager.objects.create(pk="000000000000000000000002")
response = self.client.get(
reverse("admin:admin_views_filteredmanager_changelist")
)
- self.assertContains(response, "PK=1")
- self.assertContains(response, "PK=2")
+ self.assertContains(response, "PK=000000000000000000000001")
+ self.assertContains(response, "PK=000000000000000000000002")
self.assertEqual(
self.client.get(
- reverse("admin:admin_views_filteredmanager_history", args=(1,))
+ reverse(
+ "admin:admin_views_filteredmanager_history",
+ args=("000000000000000000000001",),
+ )
).status_code,
200,
)
self.assertEqual(
self.client.get(
- reverse("admin:admin_views_filteredmanager_history", args=(2,))
+ reverse(
+ "admin:admin_views_filteredmanager_history",
+ args=("000000000000000000000002",),
+ )
).status_code,
200,
)
@@ -5287,7 +5345,9 @@ def setUpTestData(cls):
cls.superuser = User.objects.create_superuser(
username="super", password="secret", email="super@example.com"
)
- cls.collector = Collector.objects.create(pk=1, name="John Fowles")
+ cls.collector = Collector.objects.create(
+ id="000000000000000000000001", name="John Fowles"
+ )
def setUp(self):
self.post_data = {
@@ -5296,59 +5356,59 @@ def setUp(self):
"widget_set-INITIAL_FORMS": "0",
"widget_set-MAX_NUM_FORMS": "0",
"widget_set-0-id": "",
- "widget_set-0-owner": "1",
+ "widget_set-0-owner": str(self.collector.pk),
"widget_set-0-name": "",
"widget_set-1-id": "",
- "widget_set-1-owner": "1",
+ "widget_set-1-owner": str(self.collector.pk),
"widget_set-1-name": "",
"widget_set-2-id": "",
- "widget_set-2-owner": "1",
+ "widget_set-2-owner": str(self.collector.pk),
"widget_set-2-name": "",
"doohickey_set-TOTAL_FORMS": "3",
"doohickey_set-INITIAL_FORMS": "0",
"doohickey_set-MAX_NUM_FORMS": "0",
- "doohickey_set-0-owner": "1",
+ "doohickey_set-0-owner": str(self.collector.pk),
"doohickey_set-0-code": "",
"doohickey_set-0-name": "",
- "doohickey_set-1-owner": "1",
+ "doohickey_set-1-owner": str(self.collector.pk),
"doohickey_set-1-code": "",
"doohickey_set-1-name": "",
- "doohickey_set-2-owner": "1",
+ "doohickey_set-2-owner": str(self.collector.pk),
"doohickey_set-2-code": "",
"doohickey_set-2-name": "",
"grommet_set-TOTAL_FORMS": "3",
"grommet_set-INITIAL_FORMS": "0",
"grommet_set-MAX_NUM_FORMS": "0",
"grommet_set-0-code": "",
- "grommet_set-0-owner": "1",
+ "grommet_set-0-owner": str(self.collector.pk),
"grommet_set-0-name": "",
"grommet_set-1-code": "",
- "grommet_set-1-owner": "1",
+ "grommet_set-1-owner": str(self.collector.pk),
"grommet_set-1-name": "",
"grommet_set-2-code": "",
- "grommet_set-2-owner": "1",
+ "grommet_set-2-owner": str(self.collector.pk),
"grommet_set-2-name": "",
"whatsit_set-TOTAL_FORMS": "3",
"whatsit_set-INITIAL_FORMS": "0",
"whatsit_set-MAX_NUM_FORMS": "0",
- "whatsit_set-0-owner": "1",
+ "whatsit_set-0-owner": str(self.collector.pk),
"whatsit_set-0-index": "",
"whatsit_set-0-name": "",
- "whatsit_set-1-owner": "1",
+ "whatsit_set-1-owner": str(self.collector.pk),
"whatsit_set-1-index": "",
"whatsit_set-1-name": "",
- "whatsit_set-2-owner": "1",
+ "whatsit_set-2-owner": str(self.collector.pk),
"whatsit_set-2-index": "",
"whatsit_set-2-name": "",
"fancydoodad_set-TOTAL_FORMS": "3",
"fancydoodad_set-INITIAL_FORMS": "0",
"fancydoodad_set-MAX_NUM_FORMS": "0",
"fancydoodad_set-0-doodad_ptr": "",
- "fancydoodad_set-0-owner": "1",
+ "fancydoodad_set-0-owner": str(self.collector.pk),
"fancydoodad_set-0-name": "",
"fancydoodad_set-0-expensive": "on",
"fancydoodad_set-1-doodad_ptr": "",
- "fancydoodad_set-1-owner": "1",
+ "fancydoodad_set-1-owner": str(self.collector.pk),
"fancydoodad_set-1-name": "",
"fancydoodad_set-1-expensive": "on",
"fancydoodad_set-2-doodad_ptr": "",
@@ -5360,13 +5420,13 @@ def setUp(self):
"category_set-MAX_NUM_FORMS": "0",
"category_set-0-order": "",
"category_set-0-id": "",
- "category_set-0-collector": "1",
+ "category_set-0-collector": str(self.collector.pk),
"category_set-1-order": "",
"category_set-1-id": "",
- "category_set-1-collector": "1",
+ "category_set-1-collector": str(self.collector.pk),
"category_set-2-order": "",
"category_set-2-id": "",
- "category_set-2-collector": "1",
+ "category_set-2-collector": str(self.collector.pk),
}
self.client.force_login(self.superuser)
@@ -5556,10 +5616,18 @@ def test_ordered_inline(self):
An inline with an editable ordering fields is updated correctly.
"""
# Create some objects with an initial ordering
- Category.objects.create(id=1, order=1, collector=self.collector)
- Category.objects.create(id=2, order=2, collector=self.collector)
- Category.objects.create(id=3, order=0, collector=self.collector)
- Category.objects.create(id=4, order=0, collector=self.collector)
+ Category.objects.create(
+ id="000000000000000000000001", order=1, collector=self.collector
+ )
+ Category.objects.create(
+ id="000000000000000000000002", order=2, collector=self.collector
+ )
+ Category.objects.create(
+ id="000000000000000000000003", order=0, collector=self.collector
+ )
+ Category.objects.create(
+ id="000000000000000000000004", order=0, collector=self.collector
+ )
# NB: The order values must be changed so that the items are reordered.
self.post_data.update(
@@ -5569,26 +5637,26 @@ def test_ordered_inline(self):
"category_set-INITIAL_FORMS": "4",
"category_set-MAX_NUM_FORMS": "0",
"category_set-0-order": "14",
- "category_set-0-id": "1",
- "category_set-0-collector": "1",
+ "category_set-0-id": "000000000000000000000001",
+ "category_set-0-collector": str(self.collector.pk),
"category_set-1-order": "13",
- "category_set-1-id": "2",
- "category_set-1-collector": "1",
+ "category_set-1-id": "000000000000000000000002",
+ "category_set-1-collector": str(self.collector.pk),
"category_set-2-order": "1",
- "category_set-2-id": "3",
- "category_set-2-collector": "1",
+ "category_set-2-id": "000000000000000000000003",
+ "category_set-2-collector": str(self.collector.pk),
"category_set-3-order": "0",
- "category_set-3-id": "4",
- "category_set-3-collector": "1",
+ "category_set-3-id": "000000000000000000000004",
+ "category_set-3-collector": str(self.collector.pk),
"category_set-4-order": "",
"category_set-4-id": "",
- "category_set-4-collector": "1",
+ "category_set-4-collector": str(self.collector.pk),
"category_set-5-order": "",
"category_set-5-id": "",
- "category_set-5-collector": "1",
+ "category_set-5-collector": str(self.collector.pk),
"category_set-6-order": "",
"category_set-6-id": "",
- "category_set-6-collector": "1",
+ "category_set-6-collector": str(self.collector.pk),
}
)
collector_url = reverse(
@@ -5600,10 +5668,10 @@ def test_ordered_inline(self):
# The order values have been applied to the right objects
self.assertEqual(self.collector.category_set.count(), 4)
- self.assertEqual(Category.objects.get(id=1).order, 14)
- self.assertEqual(Category.objects.get(id=2).order, 13)
- self.assertEqual(Category.objects.get(id=3).order, 1)
- self.assertEqual(Category.objects.get(id=4).order, 0)
+ self.assertEqual(Category.objects.get(id="000000000000000000000001").order, 14)
+ self.assertEqual(Category.objects.get(id="000000000000000000000002").order, 13)
+ self.assertEqual(Category.objects.get(id="000000000000000000000003").order, 1)
+ self.assertEqual(Category.objects.get(id="000000000000000000000004").order, 0)
@override_settings(ROOT_URLCONF="admin_views.urls")
@@ -8036,7 +8104,7 @@ def send_message(self, level):
message with the level has appeared in the response.
"""
action_data = {
- ACTION_CHECKBOX_NAME: [1],
+ ACTION_CHECKBOX_NAME: ["000000000000000000000001"],
"action": "message_%s" % level,
"index": 0,
}
@@ -8068,7 +8136,7 @@ def test_message_error(self):
def test_message_extra_tags(self):
action_data = {
- ACTION_CHECKBOX_NAME: [1],
+ ACTION_CHECKBOX_NAME: ["000000000000000000000001"],
"action": "message_extra_tags",
"index": 0,
}
diff --git a/tests/admin_widgets/models.py b/tests/admin_widgets/models.py
index 0113ecb7c8..fb55c870db 100644
--- a/tests/admin_widgets/models.py
+++ b/tests/admin_widgets/models.py
@@ -108,7 +108,7 @@ class Event(models.Model):
main_band = models.ForeignKey(
Band,
models.CASCADE,
- limit_choices_to=models.Q(pk__gt=0),
+ limit_choices_to=models.Q(pk__gt="000000000000000000000000"),
related_name="events_main_band_at",
)
supporting_bands = models.ManyToManyField(
diff --git a/tests/aggregation/tests.py b/tests/aggregation/tests.py
index 228167b20f..e5e5ebabe3 100644
--- a/tests/aggregation/tests.py
+++ b/tests/aggregation/tests.py
@@ -2361,7 +2361,12 @@ def test_aggregate_reference_lookup_rhs(self):
def test_aggregate_reference_lookup_rhs_iter(self):
aggregates = Author.objects.annotate(
max_book_author=Max("book__authors"),
- ).aggregate(count=Count("id", filter=Q(id__in=[F("max_book_author"), 0])))
+ ).aggregate(
+ count=Count(
+ "id",
+ filter=Q(id__in=[F("max_book_author"), "000000000000000000000000"]),
+ )
+ )
self.assertEqual(aggregates, {"count": 1})
@skipUnlessDBFeature("supports_select_union")
diff --git a/tests/aggregation_regress/tests.py b/tests/aggregation_regress/tests.py
index 68bb0f0435..b4c79d6482 100644
--- a/tests/aggregation_regress/tests.py
+++ b/tests/aggregation_regress/tests.py
@@ -1432,7 +1432,7 @@ def test_annotate_joins(self):
qs = Book.objects.annotate(n=Count("pk"))
self.assertIs(qs.query.alias_map["aggregation_regress_book"].join_type, None)
# The query executes without problems.
- self.assertEqual(len(qs.exclude(publisher=-1)), 6)
+ self.assertEqual(len(qs.exclude(publisher="000000000000000000000001")), 6)
@skipUnlessDBFeature("allows_group_by_selected_pks")
def test_aggregate_duplicate_columns(self):
diff --git a/tests/auth_tests/fixtures/natural.json b/tests/auth_tests/fixtures/natural.json
index 7811c7a548..1e1ccca690 100644
--- a/tests/auth_tests/fixtures/natural.json
+++ b/tests/auth_tests/fixtures/natural.json
@@ -1,6 +1,6 @@
[
{
- "pk": 1,
+ "pk": "000000000000000000000001",
"model": "auth.group",
"fields": {
"name": "my_group",
@@ -8,7 +8,7 @@
}
},
{
- "pk": 1,
+ "pk": "000000000000000000000001",
"model": "auth.user",
"fields": {
"username": "my_username",
diff --git a/tests/auth_tests/fixtures/regular.json b/tests/auth_tests/fixtures/regular.json
index b9f2680766..781898a5bd 100644
--- a/tests/auth_tests/fixtures/regular.json
+++ b/tests/auth_tests/fixtures/regular.json
@@ -1,6 +1,6 @@
[
{
- "pk": 1,
+ "pk": "000000000000000000000001",
"model": "auth.group",
"fields": {
"name": "my_group",
@@ -8,7 +8,7 @@
}
},
{
- "pk": 1,
+ "pk": "000000000000000000000001",
"model": "auth.user",
"fields": {
"username": "my_username",
@@ -19,7 +19,7 @@
"is_staff": true,
"last_login": "2012-01-13 00:14:00",
"groups": [
- 1
+ "000000000000000000000001"
],
"user_permissions": [],
"password": "pbkdf2_sha256$10000$LUyhxJjuLwXF$f6Zbpnx1L5dPze8m0itBaHMDyZ/n6JyhuavQy2RrBIM=",
diff --git a/tests/auth_tests/test_management.py b/tests/auth_tests/test_management.py
index 38863969fc..744012c05e 100644
--- a/tests/auth_tests/test_management.py
+++ b/tests/auth_tests/test_management.py
@@ -600,8 +600,10 @@ def test(self):
def test_validate_fk(self):
email = Email.objects.create(email="mymail@gmail.com")
Group.objects.all().delete()
- nonexistent_group_id = 1
- msg = f"group instance with id {nonexistent_group_id} does not exist."
+ nonexistent_group_id = "000000000000000000000001"
+ msg = (
+ f"group instance with id ObjectId('{nonexistent_group_id}') does not exist."
+ )
with self.assertRaisesMessage(CommandError, msg):
call_command(
@@ -639,8 +641,10 @@ def test_validate_fk_environment_variable(self):
def test_validate_fk_via_option_interactive(self):
email = Email.objects.create(email="mymail@gmail.com")
Group.objects.all().delete()
- nonexistent_group_id = 1
- msg = f"group instance with id {nonexistent_group_id} does not exist."
+ nonexistent_group_id = "000000000000000000000001"
+ msg = (
+ f"group instance with id ObjectId('{nonexistent_group_id}') does not exist."
+ )
@mock_inputs(
{
diff --git a/tests/auth_tests/test_views.py b/tests/auth_tests/test_views.py
index 97d0448ab1..9bd81a87da 100644
--- a/tests/auth_tests/test_views.py
+++ b/tests/auth_tests/test_views.py
@@ -1749,7 +1749,8 @@ def test_admin_password_change(self):
)
self.assertRedirects(response, user_change_url)
row = LogEntry.objects.latest("id")
- self.assertEqual(row.user_id, 1) # hardcoded in CustomUserAdmin.log_change()
+ # hardcoded in CustomUserAdmin.log_change()
+ self.assertEqual(str(row.user_id), "000000000000000000000001")
self.assertEqual(row.object_id, str(u.pk))
self.assertEqual(row.get_change_message(), "Changed password.")
diff --git a/tests/auth_tests/urls_custom_user_admin.py b/tests/auth_tests/urls_custom_user_admin.py
index 1c7ce1eb42..46caeadaf3 100644
--- a/tests/auth_tests/urls_custom_user_admin.py
+++ b/tests/auth_tests/urls_custom_user_admin.py
@@ -9,9 +9,9 @@
class CustomUserAdmin(UserAdmin):
def log_change(self, request, obj, message):
# LogEntry.user column doesn't get altered to expect a UUID, so set an
- # integer manually to avoid causing an error.
+ # ObjectId manually to avoid causing an error.
original_pk = request.user.pk
- request.user.pk = 1
+ request.user.pk = "000000000000000000000001"
super().log_change(request, obj, message)
request.user.pk = original_pk
diff --git a/tests/backends/base/test_creation.py b/tests/backends/base/test_creation.py
index d69499b121..c0c741c953 100644
--- a/tests/backends/base/test_creation.py
+++ b/tests/backends/base/test_creation.py
@@ -179,13 +179,13 @@ def test_circular_reference(self):
[
{
"model": "backends.object",
- "pk": 1,
- "fields": {"obj_ref": 1, "related_objects": []}
+ "pk": "000000000000000000000001",
+ "fields": {"obj_ref": "000000000000000000000001", "related_objects": []}
},
{
"model": "backends.objectreference",
- "pk": 1,
- "fields": {"obj": 1}
+ "pk": "000000000000000000000001",
+ "fields": {"obj": "000000000000000000000001"}
}
]
"""
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index e4f898c5ef..00d00a5d77 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -609,7 +609,7 @@ def test_integrity_checks_on_creation(self):
a1 = Article(
headline="This is a test",
pub_date=datetime.datetime(2005, 7, 27),
- reporter_id=30,
+ reporter_id="000000000000000000000030",
)
try:
a1.save()
@@ -641,7 +641,7 @@ def test_integrity_checks_on_update(self):
)
# Retrieve it from the DB
a1 = Article.objects.get(headline="Test article")
- a1.reporter_id = 30
+ a1.reporter_id = "000000000000000000000030"
try:
a1.save()
except IntegrityError:
@@ -678,7 +678,7 @@ def test_disable_constraint_checks_manually(self):
)
# Retrieve it from the DB
a = Article.objects.get(headline="Test article")
- a.reporter_id = 30
+ a.reporter_id = "000000000000000000000030"
try:
connection.disable_constraint_checking()
a.save()
@@ -701,7 +701,7 @@ def test_disable_constraint_checks_context_manager(self):
)
# Retrieve it from the DB
a = Article.objects.get(headline="Test article")
- a.reporter_id = 30
+ a.reporter_id = "000000000000000000000030"
try:
with connection.constraint_checks_disabled():
a.save()
@@ -722,7 +722,7 @@ def test_check_constraints(self):
)
# Retrieve it from the DB
a = Article.objects.get(headline="Test article")
- a.reporter_id = 30
+ a.reporter_id = "000000000000000000000030"
with connection.constraint_checks_disabled():
a.save()
try:
@@ -737,7 +737,7 @@ def test_check_constraints_sql_keywords(self):
with transaction.atomic():
obj = SQLKeywordsModel.objects.create(reporter=self.r)
obj.refresh_from_db()
- obj.reporter_id = 30
+ obj.reporter_id = "000000000000000000000030"
with connection.constraint_checks_disabled():
obj.save()
try:
@@ -959,9 +959,9 @@ def test_can_reference_existent(self):
self.assertEqual(ref.obj, obj)
def test_can_reference_non_existent(self):
- self.assertFalse(Object.objects.filter(id=12345).exists())
- ref = ObjectReference.objects.create(obj_id=12345)
- ref_new = ObjectReference.objects.get(obj_id=12345)
+ self.assertFalse(Object.objects.filter(id="000000000000000000012345").exists())
+ ref = ObjectReference.objects.create(obj_id="000000000000000000012345")
+ ref_new = ObjectReference.objects.get(obj_id="000000000000000000012345")
self.assertEqual(ref, ref_new)
with self.assertRaises(Object.DoesNotExist):
@@ -976,6 +976,8 @@ def test_many_to_many(self):
intermediary_model = Object._meta.get_field(
"related_objects"
).remote_field.through
- intermediary_model.objects.create(from_object_id=obj.id, to_object_id=12345)
+ intermediary_model.objects.create(
+ from_object_id=obj.id, to_object_id="000000000000000000012345"
+ )
self.assertEqual(obj.related_objects.count(), 1)
self.assertEqual(intermediary_model.objects.count(), 2)
diff --git a/tests/basic/tests.py b/tests/basic/tests.py
index cef6e29b9b..558b308df2 100644
--- a/tests/basic/tests.py
+++ b/tests/basic/tests.py
@@ -421,12 +421,12 @@ def test_microsecond_precision_not_supported_edge_case(self):
def test_manually_specify_primary_key(self):
# You can manually specify the primary key when creating a new object.
a101 = Article(
- id=101,
+ id="000000000000000000000101",
headline="Article 101",
pub_date=datetime(2005, 7, 31, 12, 30, 45),
)
a101.save()
- a101 = Article.objects.get(pk=101)
+ a101 = Article.objects.get(pk="000000000000000000000101")
self.assertEqual(a101.headline, "Article 101")
def test_create_method(self):
@@ -763,7 +763,7 @@ def test_does_not_exist(self):
ObjectDoesNotExist, "Article matching query does not exist."
):
Article.objects.get(
- id__exact=2000,
+ id__exact="000000000000000000002000",
)
# To avoid dict-ordering related errors check only one lookup
# in single assert.
diff --git a/tests/bulk_create/tests.py b/tests/bulk_create/tests.py
index 7b86a2def5..e5dfacd6f6 100644
--- a/tests/bulk_create/tests.py
+++ b/tests/bulk_create/tests.py
@@ -226,14 +226,14 @@ def test_large_batch_mixed(self):
"""
TwoFields.objects.bulk_create(
[
- TwoFields(id=i if i % 2 == 0 else None, f1=i, f2=i + 1)
+ TwoFields(id=f"{i:024}" if i % 2 == 0 else None, f1=i, f2=i + 1)
for i in range(100000, 101000)
]
)
self.assertEqual(TwoFields.objects.count(), 1000)
# We can't assume much about the ID's created, except that the above
# created IDs must exist.
- id_range = range(100000, 101000, 2)
+ id_range = [f"{i:024}" for i in range(100000, 101000, 2)]
self.assertEqual(TwoFields.objects.filter(id__in=id_range).count(), 500)
self.assertEqual(TwoFields.objects.exclude(id__in=id_range).count(), 500)
@@ -247,7 +247,7 @@ def test_large_batch_mixed_efficiency(self):
connection.queries_log.clear()
TwoFields.objects.bulk_create(
[
- TwoFields(id=i if i % 2 == 0 else None, f1=i, f2=i + 1)
+ TwoFields(id=f"{i:024}" if i % 2 == 0 else None, f1=i, f2=i + 1)
for i in range(100000, 101000)
]
)
diff --git a/tests/check_framework/test_model_checks.py b/tests/check_framework/test_model_checks.py
index be504f9c2d..97b0373585 100644
--- a/tests/check_framework/test_model_checks.py
+++ b/tests/check_framework/test_model_checks.py
@@ -69,7 +69,9 @@ class Meta:
],
)
- @modify_settings(INSTALLED_APPS={"append": "basic"})
+ @modify_settings(
+ INSTALLED_APPS={"append": "basic", "remove": "django.contrib.sites"}
+ )
@isolate_apps("basic", "check_framework", kwarg_name="apps")
def test_collision_across_apps(self, apps):
class Model1(models.Model):
@@ -94,7 +96,9 @@ class Meta:
],
)
- @modify_settings(INSTALLED_APPS={"append": "basic"})
+ @modify_settings(
+ INSTALLED_APPS={"append": "basic", "remove": "django.contrib.sites"}
+ )
@override_settings(
DATABASE_ROUTERS=["check_framework.test_model_checks.EmptyRouter"]
)
@@ -235,7 +239,9 @@ class Model2(AbstractModel):
self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
- @modify_settings(INSTALLED_APPS={"append": "basic"})
+ @modify_settings(
+ INSTALLED_APPS={"append": "basic", "remove": "django.contrib.sites"}
+ )
@isolate_apps("basic", "check_framework", kwarg_name="apps")
def test_collision_across_apps(self, apps):
index = models.Index(fields=["id"], name="foo")
@@ -261,7 +267,9 @@ class Meta:
],
)
- @modify_settings(INSTALLED_APPS={"append": "basic"})
+ @modify_settings(
+ INSTALLED_APPS={"append": "basic", "remove": "django.contrib.sites"}
+ )
@isolate_apps("basic", "check_framework", kwarg_name="apps")
def test_no_collision_across_apps_interpolation(self, apps):
index = models.Index(fields=["id"], name="%(app_label)s_%(class)s_foo")
@@ -367,7 +375,9 @@ class Model2(AbstractModel):
self.assertEqual(checks.run_checks(app_configs=self.apps.get_app_configs()), [])
- @modify_settings(INSTALLED_APPS={"append": "basic"})
+ @modify_settings(
+ INSTALLED_APPS={"append": "basic", "remove": "django.contrib.sites"}
+ )
@isolate_apps("basic", "check_framework", kwarg_name="apps")
def test_collision_across_apps(self, apps):
constraint = models.CheckConstraint(condition=models.Q(id__gt=0), name="foo")
diff --git a/tests/contenttypes_tests/test_views.py b/tests/contenttypes_tests/test_views.py
index 75f39a7bab..7d3034e1aa 100644
--- a/tests/contenttypes_tests/test_views.py
+++ b/tests/contenttypes_tests/test_views.py
@@ -27,7 +27,9 @@ class ContentTypesViewsTests(TestCase):
def setUpTestData(cls):
# Don't use the manager to ensure the site exists with pk=1, regardless
# of whether or not it already exists.
- cls.site1 = Site(pk=1, domain="testserver", name="testserver")
+ cls.site1 = Site(
+ pk="000000000000000000000001", domain="testserver", name="testserver"
+ )
cls.site1.save()
cls.author1 = Author.objects.create(name="Boris")
cls.article1 = Article.objects.create(
@@ -178,7 +180,7 @@ def test_shortcut_view_with_site_m2m(self, get_model):
# domains in the MockSite model.
MockSite.objects.bulk_create(
[
- MockSite(pk=1, domain="example.com"),
+ MockSite(pk="000000000000000000000001", domain="example.com"),
MockSite(pk=self.site_2.pk, domain=self.site_2.domain),
MockSite(pk=self.site_3.pk, domain=self.site_3.domain),
]
diff --git a/tests/db_functions/comparison/test_coalesce.py b/tests/db_functions/comparison/test_coalesce.py
index b08ae742df..cbb7bed1aa 100644
--- a/tests/db_functions/comparison/test_coalesce.py
+++ b/tests/db_functions/comparison/test_coalesce.py
@@ -67,9 +67,15 @@ def test_empty_queryset(self):
queryset = Author.objects.values("id")
tests = [
(queryset.none(), "QuerySet.none()"),
- (queryset.filter(id=0), "QuerySet.filter(id=0)"),
+ (
+ queryset.filter(id="000000000000000000000000"),
+ "QuerySet.filter(id=000000000000000000000000)",
+ ),
(Subquery(queryset.none()), "Subquery(QuerySet.none())"),
- (Subquery(queryset.filter(id=0)), "Subquery(Queryset.filter(id=0)"),
+ (
+ Subquery(queryset.filter(id="000000000000000000000000")),
+ "Subquery(Queryset.filter(id000000000000000000000000)",
+ ),
]
for empty_query, description in tests:
with self.subTest(description), self.assertNumQueries(1):
diff --git a/tests/delete_regress/models.py b/tests/delete_regress/models.py
index b0e1e0b2a8..316a2dccf8 100644
--- a/tests/delete_regress/models.py
+++ b/tests/delete_regress/models.py
@@ -91,7 +91,11 @@ class Item(models.Model):
version = models.ForeignKey(Version, models.CASCADE)
location = models.ForeignKey(Location, models.SET_NULL, blank=True, null=True)
location_value = models.ForeignKey(
- Location, models.SET(42), default=1, db_constraint=False, related_name="+"
+ Location,
+ models.SET("000000000000000000000042"),
+ default="000000000000000000000001",
+ db_constraint=False,
+ related_name="+",
)
diff --git a/tests/delete_regress/tests.py b/tests/delete_regress/tests.py
index ce5a0db8ab..2e2da1777a 100644
--- a/tests/delete_regress/tests.py
+++ b/tests/delete_regress/tests.py
@@ -115,7 +115,7 @@ def test_fk_to_m2m_through(self):
self.assertEqual(PlayedWithNote.objects.count(), 0)
def test_15776(self):
- policy = Policy.objects.create(pk=1, policy_number="1234")
+ policy = Policy.objects.create(policy_number="1234")
version = Version.objects.create(policy=policy)
location = Location.objects.create(version=version)
Item.objects.create(version=version, location=location)
diff --git a/tests/expressions_case/tests.py b/tests/expressions_case/tests.py
index 8704a7b991..d215a4fa1c 100644
--- a/tests/expressions_case/tests.py
+++ b/tests/expressions_case/tests.py
@@ -466,7 +466,7 @@ def test_condition_with_lookups(self):
def test_case_reuse(self):
SOME_CASE = Case(
- When(pk=0, then=Value("0")),
+ When(pk="000000000000000000000000", then=Value("0")),
default=Value("1"),
)
self.assertQuerySetEqual(
@@ -1360,7 +1360,7 @@ def test_join_promotion(self):
self.assertQuerySetEqual(
CaseTestModel.objects.filter(pk=o.pk).annotate(
foo=Case(
- When(fk_rel__pk=1, then=2),
+ When(fk_rel__pk="000000000000000000000001", then=2),
default=3,
),
),
@@ -1390,11 +1390,11 @@ def test_join_promotion_multiple_annotations(self):
self.assertQuerySetEqual(
CaseTestModel.objects.filter(pk=o.pk).annotate(
foo=Case(
- When(fk_rel__pk=1, then=2),
+ When(fk_rel__pk="000000000000000000000001", then=2),
default=3,
),
bar=Case(
- When(fk_rel__pk=1, then=4),
+ When(fk_rel__pk="000000000000000000000001", then=4),
default=5,
),
),
diff --git a/tests/fixtures/fixtures/circular_reference.json b/tests/fixtures/fixtures/circular_reference.json
index 0656c30c93..1ac092e251 100644
--- a/tests/fixtures/fixtures/circular_reference.json
+++ b/tests/fixtures/fixtures/circular_reference.json
@@ -1,18 +1,18 @@
[
{
"model": "fixtures.circulara",
- "pk": 1,
+ "pk": "000000000000000000000001",
"fields": {
"key": "x",
- "obj": 1
+ "obj": "000000000000000000000001"
}
},
{
"model": "fixtures.circularb",
- "pk": 1,
+ "pk": "000000000000000000000001",
"fields": {
"key": "y",
- "obj": 1
+ "obj": "000000000000000000000001"
}
}
]
diff --git a/tests/fixtures/fixtures/db_fixture_1.default.json b/tests/fixtures/fixtures/db_fixture_1.default.json
index 9bb39e400f..8d002bab44 100644
--- a/tests/fixtures/fixtures/db_fixture_1.default.json
+++ b/tests/fixtures/fixtures/db_fixture_1.default.json
@@ -1,10 +1,10 @@
[
{
- "pk": "6",
+ "pk": "000000000000000000000006",
"model": "fixtures.article",
"fields": {
"headline": "Who needs more than one database?",
"pub_date": "2006-06-16 14:00:00"
}
}
-]
\ No newline at end of file
+]
diff --git a/tests/fixtures/fixtures/db_fixture_2.default.json.gz b/tests/fixtures/fixtures/db_fixture_2.default.json.gz
index 80e4ba139f..2255f61512 100644
Binary files a/tests/fixtures/fixtures/db_fixture_2.default.json.gz and b/tests/fixtures/fixtures/db_fixture_2.default.json.gz differ
diff --git a/tests/fixtures/fixtures/fixture1.json b/tests/fixtures/fixtures/fixture1.json
index 332feaef77..aa2ea28eac 100644
--- a/tests/fixtures/fixtures/fixture1.json
+++ b/tests/fixtures/fixtures/fixture1.json
@@ -1,6 +1,6 @@
[
{
- "pk": 1,
+ "pk": "000000000000000000000001",
"model": "sites.site",
"fields": {
"domain": "example.com",
@@ -8,7 +8,7 @@
}
},
{
- "pk": "2",
+ "pk": "000000000000000000000002",
"model": "fixtures.article",
"fields": {
"headline": "Poker has no place on ESPN",
@@ -16,7 +16,7 @@
}
},
{
- "pk": "3",
+ "pk": "000000000000000000000003",
"model": "fixtures.article",
"fields": {
"headline": "Time to reform copyright",
@@ -24,7 +24,7 @@
}
},
{
- "pk": 1,
+ "pk": "000000000000000000000001",
"model": "fixtures.category",
"fields": {
"description": "Latest news stories",
diff --git a/tests/fixtures/fixtures/fixture2.json b/tests/fixtures/fixtures/fixture2.json
index a697448327..e69148be9e 100644
--- a/tests/fixtures/fixtures/fixture2.json
+++ b/tests/fixtures/fixtures/fixture2.json
@@ -1,6 +1,6 @@
[
{
- "pk": "3",
+ "pk": "000000000000000000000003",
"model": "fixtures.article",
"fields": {
"headline": "Copyright is fine the way it is",
@@ -8,7 +8,7 @@
}
},
{
- "pk": "4",
+ "pk": "000000000000000000000004",
"model": "fixtures.article",
"fields": {
"headline": "Django conquers world!",
diff --git a/tests/fixtures/fixtures/fixture3.xml b/tests/fixtures/fixtures/fixture3.xml
index 9ced78162e..1f0325d768 100644
--- a/tests/fixtures/fixtures/fixture3.xml
+++ b/tests/fixtures/fixtures/fixture3.xml
@@ -1,11 +1,11 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
' '' - '' + '' '
', ) @@ -925,7 +925,9 @@ def test_inline_formsets_with_nullable_unique_together(self): extra=2, fields="__all__", ) - author = Author.objects.create(pk=1, name="Charles Baudelaire") + author = Author.objects.create( + pk="000000000000000000000001", name="Charles Baudelaire" + ) data = { # The number of forms rendered. @@ -934,9 +936,9 @@ def test_inline_formsets_with_nullable_unique_together(self): "bookwithoptionalalteditor_set-INITIAL_FORMS": "0", # The max number of forms. "bookwithoptionalalteditor_set-MAX_NUM_FORMS": "", - "bookwithoptionalalteditor_set-0-author": "1", + "bookwithoptionalalteditor_set-0-author": "000000000000000000000001", "bookwithoptionalalteditor_set-0-title": "Les Fleurs du Mal", - "bookwithoptionalalteditor_set-1-author": "1", + "bookwithoptionalalteditor_set-1-author": "000000000000000000000001", "bookwithoptionalalteditor_set-1-title": "Les Fleurs du Mal", } formset = AuthorBooksFormSet4(data, instance=author) @@ -945,21 +947,29 @@ def test_inline_formsets_with_nullable_unique_together(self): saved = formset.save() self.assertEqual(len(saved), 2) book1, book2 = saved - self.assertEqual(book1.author_id, 1) + self.assertEqual(str(book1.author_id), "000000000000000000000001") self.assertEqual(book1.title, "Les Fleurs du Mal") - self.assertEqual(book2.author_id, 1) + self.assertEqual(str(book1.author_id), "000000000000000000000001") self.assertEqual(book2.title, "Les Fleurs du Mal") def test_inline_formsets_with_custom_save_method(self): AuthorBooksFormSet = inlineformset_factory( Author, Book, can_delete=False, extra=2, fields="__all__" ) - author = Author.objects.create(pk=1, name="Charles Baudelaire") + author = Author.objects.create( + pk="000000000000000000000001", name="Charles Baudelaire" + ) book1 = Book.objects.create( - pk=1, author=author, title="Les Paradis Artificiels" + pk="000000000000000000000001", + author=author, + title="Les Paradis Artificiels", + ) + book2 = Book.objects.create( + pk="000000000000000000000002", author=author, title="Les Fleurs du Mal" + ) + book3 = Book.objects.create( + pk="000000000000000000000003", author=author, title="Flowers of Evil" ) - book2 = Book.objects.create(pk=2, author=author, title="Les Fleurs du Mal") - book3 = Book.objects.create(pk=3, author=author, title="Flowers of Evil") class PoemForm(forms.ModelForm): def save(self, commit=True): @@ -1001,9 +1011,10 @@ def save(self, commit=True): '' '' - '' - '' + '' + '' "
", ) self.assertHTMLEqual( @@ -1011,9 +1022,10 @@ def save(self, commit=True): '' '' - '' - '' + '' + '' "
", ) self.assertHTMLEqual( @@ -1021,18 +1033,18 @@ def save(self, commit=True): '' '' - '' - '
', + '' + '', ) self.assertHTMLEqual( formset.forms[3].as_p(), '' '' - '' + '' '
', ) self.assertHTMLEqual( @@ -1040,8 +1052,8 @@ def save(self, commit=True): '' '' - '' + '' '
', ) @@ -1068,18 +1080,18 @@ def save(self, commit=True): '' '' - '' - '
', + '' + '', ) self.assertHTMLEqual( formset.forms[1].as_p(), '' '' - '' + '' '
', ) self.assertHTMLEqual( @@ -1087,8 +1099,8 @@ def save(self, commit=True): '' '' - '' + '' '
', ) @@ -1165,7 +1177,9 @@ def test_custom_pk(self): # Custom primary keys with ForeignKey, OneToOneField and AutoField ############ - place = Place.objects.create(pk=1, name="Giordanos", city="Chicago") + place = Place.objects.create( + pk="000000000000000000000001", name="Giordanos", city="Chicago" + ) FormSet = inlineformset_factory( Place, Owner, extra=2, can_delete=False, fields="__all__" @@ -1177,8 +1191,8 @@ def test_custom_pk(self): '' '' - '' + '' '
', ) @@ -1187,8 +1201,8 @@ def test_custom_pk(self): '' '' - '' + '' '
', ) @@ -1217,8 +1231,8 @@ def test_custom_pk(self): '' '' - '' + '' '
' % owner1.auto_id, ) @@ -1227,8 +1241,8 @@ def test_custom_pk(self): '' '' - '' + '' '
', ) @@ -1237,8 +1251,8 @@ def test_custom_pk(self): '' '' - '' + '' '
', ) @@ -1340,7 +1354,9 @@ def test_custom_pk(self): def test_unique_true_enforces_max_num_one(self): # ForeignKey with unique=True should enforce max_num=1 - place = Place.objects.create(pk=1, name="Giordanos", city="Chicago") + place = Place.objects.create( + pk="000000000000000000000001", name="Giordanos", city="Chicago" + ) FormSet = inlineformset_factory( Place, Location, can_delete=False, fields="__all__" @@ -1357,8 +1373,8 @@ def test_unique_true_enforces_max_num_one(self): '' '' - '' + '' '
', ) @@ -1760,7 +1776,7 @@ def test_model_formset_with_initial_queryset(self): # has_changed should work with queryset and list of pk's # see #18898 FormSet = modelformset_factory(AuthorMeeting, fields="__all__") - Author.objects.create(pk=1, name="Charles Baudelaire") + Author.objects.create(pk="000000000000000000000001", name="Charles Baudelaire") data = { "form-TOTAL_FORMS": 1, "form-INITIAL_FORMS": 0, @@ -1822,10 +1838,12 @@ def test_prevent_duplicates_from_with_the_same_formset(self): self.assertTrue(formset.is_valid()) FormSet = inlineformset_factory(Author, Book, extra=0, fields="__all__") - author = Author.objects.create(pk=1, name="Charles Baudelaire") - Book.objects.create(pk=1, author=author, title="Les Paradis Artificiels") - Book.objects.create(pk=2, author=author, title="Les Fleurs du Mal") - Book.objects.create(pk=3, author=author, title="Flowers of Evil") + author = Author.objects.create( + pk="000000000000000000000001", name="Charles Baudelaire" + ) + Book.objects.create(author=author, title="Les Paradis Artificiels") + Book.objects.create(author=author, title="Les Fleurs du Mal") + Book.objects.create(author=author, title="Flowers of Evil") book_ids = author.book_set.order_by("id").values_list("id", flat=True) data = { @@ -2191,7 +2209,7 @@ def test_inlineformset_factory_help_text_overrides(self): self.assertEqual(form["title"].help_text, "Choose carefully.") def test_modelformset_factory_error_messages_overrides(self): - author = Author.objects.create(pk=1, name="Charles Baudelaire") + author = Author.objects.create(name="Charles Baudelaire") BookFormSet = modelformset_factory( Book, fields="__all__", @@ -2202,7 +2220,7 @@ def test_modelformset_factory_error_messages_overrides(self): self.assertEqual(form.errors, {"title": ["Title too long!!"]}) def test_inlineformset_factory_error_messages_overrides(self): - author = Author.objects.create(pk=1, name="Charles Baudelaire") + author = Author.objects.create(name="Charles Baudelaire") BookFormSet = inlineformset_factory( Author, Book, @@ -2214,7 +2232,7 @@ def test_inlineformset_factory_error_messages_overrides(self): self.assertEqual(form.errors, {"title": ["Title too long!!"]}) def test_modelformset_factory_field_class_overrides(self): - author = Author.objects.create(pk=1, name="Charles Baudelaire") + author = Author.objects.create(name="Charles Baudelaire") BookFormSet = modelformset_factory( Book, fields="__all__", @@ -2227,7 +2245,7 @@ def test_modelformset_factory_field_class_overrides(self): self.assertIsInstance(form.fields["title"], forms.SlugField) def test_inlineformset_factory_field_class_overrides(self): - author = Author.objects.create(pk=1, name="Charles Baudelaire") + author = Author.objects.create(name="Charles Baudelaire") BookFormSet = inlineformset_factory( Author, Book, diff --git a/tests/model_formsets_regress/tests.py b/tests/model_formsets_regress/tests.py index 0ccc2c0490..2618bbcf05 100644 --- a/tests/model_formsets_regress/tests.py +++ b/tests/model_formsets_regress/tests.py @@ -201,15 +201,21 @@ def test_inline_model_with_to_field_to_rel(self): """ FormSet = inlineformset_factory(UserProfile, ProfileNetwork, exclude=[]) - user = User.objects.create(username="guido", serial=1337, pk=1) - self.assertEqual(user.pk, 1) - profile = UserProfile.objects.create(user=user, about="about", pk=2) - self.assertEqual(profile.pk, 2) + user = User.objects.create( + username="guido", serial=1337, pk="000000000000000000000001" + ) + self.assertEqual(str(user.pk), "000000000000000000000001") + profile = UserProfile.objects.create( + user=user, about="about", pk="000000000000000000000002" + ) + self.assertEqual(str(profile.pk), "000000000000000000000002") ProfileNetwork.objects.create(profile=profile, network=10, identifier=10) formset = FormSet(instance=profile) # Testing the inline model's relation - self.assertEqual(formset[0].instance.profile_id, 1) + self.assertEqual( + str(formset[0].instance.profile_id), "000000000000000000000001" + ) def test_formset_with_none_instance(self): "A formset with instance=None can be created. Regression for #11872" diff --git a/tests/model_inheritance_regress/tests.py b/tests/model_inheritance_regress/tests.py index ba31048ac2..0a0502ae11 100644 --- a/tests/model_inheritance_regress/tests.py +++ b/tests/model_inheritance_regress/tests.py @@ -431,10 +431,14 @@ def test_abstract_verbose_name_plural_inheritance(self): def test_inherited_nullable_exclude(self): obj = SelfRefChild.objects.create(child_data=37, parent_data=42) self.assertQuerySetEqual( - SelfRefParent.objects.exclude(self_data=72), [obj.pk], attrgetter("pk") + SelfRefParent.objects.exclude(self_data="000000000000000000000072"), + [obj.pk], + attrgetter("pk"), ) self.assertQuerySetEqual( - SelfRefChild.objects.exclude(self_data=72), [obj.pk], attrgetter("pk") + SelfRefChild.objects.exclude(self_data="000000000000000000000072"), + [obj.pk], + attrgetter("pk"), ) def test_concrete_abstract_concrete_pk(self): diff --git a/tests/multiple_database/fixtures/multidb-common.json b/tests/multiple_database/fixtures/multidb-common.json index 33134173b9..02aad4cdc0 100644 --- a/tests/multiple_database/fixtures/multidb-common.json +++ b/tests/multiple_database/fixtures/multidb-common.json @@ -1,10 +1,10 @@ [ { - "pk": 1, + "pk": "000000000000000000000001", "model": "multiple_database.book", "fields": { "title": "The Definitive Guide to Django", "published": "2009-7-8" } } -] \ No newline at end of file +] diff --git a/tests/multiple_database/fixtures/multidb.default.json b/tests/multiple_database/fixtures/multidb.default.json index 379b18a803..f57c87daff 100644 --- a/tests/multiple_database/fixtures/multidb.default.json +++ b/tests/multiple_database/fixtures/multidb.default.json @@ -1,20 +1,20 @@ [ { - "pk": 1, + "pk": "000000000000000000000001", "model": "multiple_database.person", "fields": { "name": "Marty Alchin" } }, { - "pk": 2, + "pk": "000000000000000000000002", "model": "multiple_database.person", "fields": { "name": "George Vilches" } }, { - "pk": 2, + "pk": "000000000000000000000002", "model": "multiple_database.book", "fields": { "title": "Pro Django", diff --git a/tests/multiple_database/fixtures/multidb.other.json b/tests/multiple_database/fixtures/multidb.other.json index c64f490201..f67ac0e906 100644 --- a/tests/multiple_database/fixtures/multidb.other.json +++ b/tests/multiple_database/fixtures/multidb.other.json @@ -1,20 +1,20 @@ [ { - "pk": 1, + "pk": "000000000000000000000001", "model": "multiple_database.person", "fields": { "name": "Mark Pilgrim" } }, { - "pk": 2, + "pk": "000000000000000000000002", "model": "multiple_database.person", "fields": { "name": "Chris Mills" } }, { - "pk": 2, + "pk": "000000000000000000000002", "model": "multiple_database.book", "fields": { "title": "Dive into Python", @@ -23,4 +23,4 @@ "editor": ["Chris Mills"] } } -] \ No newline at end of file +] diff --git a/tests/multiple_database/fixtures/pets.json b/tests/multiple_database/fixtures/pets.json index 89756a3e5b..c6f059de48 100644 --- a/tests/multiple_database/fixtures/pets.json +++ b/tests/multiple_database/fixtures/pets.json @@ -1,18 +1,18 @@ [ { - "pk": 1, + "pk": "000000000000000000000001", "model": "multiple_database.pet", "fields": { "name": "Mr Bigglesworth", - "owner": 1 + "owner": "000000000000000000000001" } }, { - "pk": 2, + "pk": "000000000000000000000002", "model": "multiple_database.pet", "fields": { "name": "Spot", - "owner": 2 + "owner": "000000000000000000000002" } } -] \ No newline at end of file +] diff --git a/tests/multiple_database/tests.py b/tests/multiple_database/tests.py index 23d2f37f65..a790a442a0 100644 --- a/tests/multiple_database/tests.py +++ b/tests/multiple_database/tests.py @@ -884,7 +884,7 @@ def test_o2o_cross_database_protection(self): new_bob_profile = UserProfile(flavor="spring surprise") # assigning a profile requires an explicit pk as the object isn't saved - charlie = User(pk=51, username="charlie", email="charlie@example.com") + charlie = User(username="charlie", email="charlie@example.com") charlie.set_unusable_password() # initially, no db assigned @@ -1645,16 +1645,16 @@ def test_m2m_cross_database_protection(self): "M2M relations can cross databases if the database share a source" # Create books and authors on the inverse to the usual database pro = Book.objects.using("other").create( - pk=1, title="Pro Django", published=datetime.date(2008, 12, 16) + title="Pro Django", published=datetime.date(2008, 12, 16) ) - marty = Person.objects.using("other").create(pk=1, name="Marty Alchin") + marty = Person.objects.using("other").create(name="Marty Alchin") dive = Book.objects.using("default").create( - pk=2, title="Dive into Python", published=datetime.date(2009, 5, 4) + title="Dive into Python", published=datetime.date(2009, 5, 4) ) - mark = Person.objects.using("default").create(pk=2, name="Mark Pilgrim") + mark = Person.objects.using("default").create(name="Mark Pilgrim") # Now save back onto the usual database. # This simulates primary/replica - the objects exist on both database, @@ -1737,14 +1737,16 @@ def test_m2m_cross_database_protection(self): # If you create an object through a M2M relation, it will be # written to the write database, even if the original object # was on the read database - alice = dive.authors.create(name="Alice", pk=3) + alice = dive.authors.create(name="Alice") self.assertEqual(alice._state.db, "default") # Same goes for get_or_create, regardless of whether getting or creating alice, created = dive.authors.get_or_create(name="Alice") self.assertEqual(alice._state.db, "default") - bob, created = dive.authors.get_or_create(name="Bob", defaults={"pk": 4}) + bob, created = dive.authors.get_or_create( + name="Bob", defaults={"pk": "000000000000000000000004"} + ) self.assertEqual(bob._state.db, "default") def test_o2o_cross_database_protection(self): @@ -1848,10 +1850,10 @@ def test_generic_key_cross_database_protection(self): def test_m2m_managers(self): "M2M relations are represented by managers, and can be controlled like managers" pro = Book.objects.using("other").create( - pk=1, title="Pro Django", published=datetime.date(2008, 12, 16) + title="Pro Django", published=datetime.date(2008, 12, 16) ) - marty = Person.objects.using("other").create(pk=1, name="Marty Alchin") + marty = Person.objects.using("other").create(name="Marty Alchin") self.assertEqual(pro.authors.db, "other") self.assertEqual(pro.authors.db_manager("default").db, "default") @@ -1866,9 +1868,8 @@ def test_foreign_key_managers(self): FK reverse relations are represented by managers, and can be controlled like managers. """ - marty = Person.objects.using("other").create(pk=1, name="Marty Alchin") + marty = Person.objects.using("other").create(name="Marty Alchin") Book.objects.using("other").create( - pk=1, title="Pro Django", published=datetime.date(2008, 12, 16), editor=marty, diff --git a/tests/or_lookups/tests.py b/tests/or_lookups/tests.py index bfcb32bea7..9fc6379f39 100644 --- a/tests/or_lookups/tests.py +++ b/tests/or_lookups/tests.py @@ -95,7 +95,9 @@ def test_pk_in(self): ) self.assertQuerySetEqual( - Article.objects.filter(pk__in=[self.a1, self.a2, self.a3, 40000]), + Article.objects.filter( + pk__in=[self.a1, self.a2, self.a3, "000000000000000000040000"] + ), ["Hello", "Goodbye", "Hello and goodbye"], attrgetter("headline"), ) diff --git a/tests/order_with_respect_to/base_tests.py b/tests/order_with_respect_to/base_tests.py index 5170c6d957..2a2ce9657a 100644 --- a/tests/order_with_respect_to/base_tests.py +++ b/tests/order_with_respect_to/base_tests.py @@ -19,10 +19,10 @@ def setUpTestData(cls): cls.q1 = cls.Question.objects.create( text="Which Beatle starts with the letter 'R'?" ) - cls.Answer.objects.create(text="John", question=cls.q1) - cls.Answer.objects.create(text="Paul", question=cls.q1) - cls.Answer.objects.create(text="George", question=cls.q1) - cls.Answer.objects.create(text="Ringo", question=cls.q1) + cls.a1 = cls.Answer.objects.create(text="John", question=cls.q1) + cls.a2 = cls.Answer.objects.create(text="Paul", question=cls.q1) + cls.a3 = cls.Answer.objects.create(text="George", question=cls.q1) + cls.a4 = cls.Answer.objects.create(text="Ringo", question=cls.q1) def test_default_to_insertion_order(self): # Answers will always be ordered in the order they were inserted. @@ -125,4 +125,6 @@ def db_for_write(self, model, **hints): using="other", ), ): - self.q1.set_answer_order([3, 1, 2, 4]) + self.q1.set_answer_order( + [self.a3.pk, self.a1.pk, self.a2.pk, self.a4.pk] + ) diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py index 38993fc43f..6e22c9249c 100644 --- a/tests/prefetch_related/tests.py +++ b/tests/prefetch_related/tests.py @@ -1639,14 +1639,16 @@ class Ticket19607Tests(TestCase): @classmethod def setUpTestData(cls): LessonEntry.objects.bulk_create( - LessonEntry(id=id_, name1=name1, name2=name2) + LessonEntry(id=f"{id_:024}", name1=name1, name2=name2) for id_, name1, name2 in [ (1, "einfach", "simple"), (2, "schwierig", "difficult"), ] ) WordEntry.objects.bulk_create( - WordEntry(id=id_, lesson_entry_id=lesson_entry_id, name=name) + WordEntry( + id=f"{id_:024}", lesson_entry_id=f"{lesson_entry_id:024}", name=name + ) for id_, lesson_entry_id, name in [ (1, 1, "einfach"), (2, 1, "simple"), diff --git a/tests/proxy_models/fixtures/mypeople.json b/tests/proxy_models/fixtures/mypeople.json index d20c8f2a6e..1414ad57bd 100644 --- a/tests/proxy_models/fixtures/mypeople.json +++ b/tests/proxy_models/fixtures/mypeople.json @@ -1,9 +1,9 @@ [ { - "pk": 100, + "pk": "000000000000000000000100", "model": "proxy_models.myperson", "fields": { "name": "Elvis Presley" } } -] \ No newline at end of file +] diff --git a/tests/proxy_models/tests.py b/tests/proxy_models/tests.py index f1476fec3e..a9bd288a74 100644 --- a/tests/proxy_models/tests.py +++ b/tests/proxy_models/tests.py @@ -107,24 +107,26 @@ def test_proxy_included_in_ancestors(self): Proxy models are included in the ancestors for a model's DoesNotExist and MultipleObjectsReturned """ - Person.objects.create(name="Foo McBar", pk=1) - MyPerson.objects.create(name="Bazza del Frob", pk=2) - LowerStatusPerson.objects.create(status="low", name="homer", pk=3) - max_id = Person.objects.aggregate(max_id=models.Max("id"))["max_id"] + Person.objects.create(name="Foo McBar", pk="000000000000000000000001") + MyPerson.objects.create(name="Bazza del Frob", pk="000000000000000000000002") + LowerStatusPerson.objects.create( + status="low", name="homer", pk="000000000000000000000002" + ) + max_id = int(str(Person.objects.aggregate(max_id=models.Max("id"))["max_id"])) with self.assertRaises(Person.DoesNotExist): MyPersonProxy.objects.get(name="Zathras") with self.assertRaises(Person.MultipleObjectsReturned): - MyPersonProxy.objects.get(id__lt=max_id + 1) + MyPersonProxy.objects.get(id__lt=f"{max_id + 1:024}") with self.assertRaises(Person.DoesNotExist): StatusPerson.objects.get(name="Zathras") - StatusPerson.objects.create(name="Bazza Jr.", pk=4) - StatusPerson.objects.create(name="Foo Jr.", pk=5) - max_id = Person.objects.aggregate(max_id=models.Max("id"))["max_id"] + StatusPerson.objects.create(name="Bazza Jr.", pk="000000000000000000000004") + StatusPerson.objects.create(name="Foo Jr.", pk="000000000000000000000005") + max_id = int(str(Person.objects.aggregate(max_id=models.Max("id"))["max_id"])) with self.assertRaises(Person.MultipleObjectsReturned): - StatusPerson.objects.get(id__lt=max_id + 1) + StatusPerson.objects.get(id__lt=f"{max_id + 1:024}") def test_abstract_base_with_model_fields(self): msg = ( @@ -392,7 +394,7 @@ def test_proxy_bug(self): def test_proxy_load_from_fixture(self): management.call_command("loaddata", "mypeople.json", verbosity=0) - p = MyPerson.objects.get(pk=100) + p = MyPerson.objects.get(pk="000000000000000000000100") self.assertEqual(p.name, "Elvis Presley") def test_select_related_only(self): diff --git a/tests/queries/test_bulk_update.py b/tests/queries/test_bulk_update.py index b2688a61c8..1768d02628 100644 --- a/tests/queries/test_bulk_update.py +++ b/tests/queries/test_bulk_update.py @@ -198,7 +198,7 @@ def test_custom_pk(self): ) def test_falsey_pk_value(self): - order = Order.objects.create(pk=0, name="test") + order = Order.objects.create(pk="000000000000000000000000", name="test") order.name = "updated" Order.objects.bulk_update([order], ["name"]) order.refresh_from_db() diff --git a/tests/queries/tests.py b/tests/queries/tests.py index fc2b54bf1e..e3de980c87 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -127,9 +127,9 @@ def setUpTestData(cls): cls.t4 = Tag.objects.create(name="t4", parent=cls.t3) cls.t5 = Tag.objects.create(name="t5", parent=cls.t3) - cls.n1 = Note.objects.create(note="n1", misc="foo", id=1) - cls.n2 = Note.objects.create(note="n2", misc="bar", id=2) - cls.n3 = Note.objects.create(note="n3", misc="foo", id=3, negate=False) + cls.n1 = Note.objects.create(note="n1", misc="foo") + cls.n2 = Note.objects.create(note="n2", misc="bar") + cls.n3 = Note.objects.create(note="n3", misc="foo", negate=False) cls.ann1 = Annotation.objects.create(name="a1", tag=cls.t1) cls.ann1.notes.add(cls.n1) @@ -184,7 +184,7 @@ def setUpTestData(cls): cls.c2 = Cover.objects.create(title="second", item=cls.i2) def test_subquery_condition(self): - qs1 = Tag.objects.filter(pk__lte=0) + qs1 = Tag.objects.filter(pk__lte="000000000000000000000000") qs2 = Tag.objects.filter(parent__in=qs1) qs3 = Tag.objects.filter(parent__in=qs2) self.assertEqual(qs3.query.subq_aliases, {"T", "U", "V"}) @@ -447,7 +447,9 @@ def test_get_clears_ordering(self): def test_tickets_4088_4306(self): self.assertSequenceEqual(Report.objects.filter(creator=1001), [self.r1]) self.assertSequenceEqual(Report.objects.filter(creator__num=1001), [self.r1]) - self.assertSequenceEqual(Report.objects.filter(creator__id=1001), []) + self.assertSequenceEqual( + Report.objects.filter(creator__id="000000000000000000001001"), [] + ) self.assertSequenceEqual( Report.objects.filter(creator__id=self.a1.id), [self.r1] ) @@ -547,7 +549,7 @@ def test_ticket2091(self): self.assertSequenceEqual(Item.objects.filter(tags__in=[t]), [self.i4]) def test_avoid_infinite_loop_on_too_many_subqueries(self): - x = Tag.objects.filter(pk=1) + x = Tag.objects.filter(pk="000000000000000000000001") local_recursion_limit = sys.getrecursionlimit() // 16 msg = "Maximum recursion depth exceeded: too many subqueries." with self.assertRaisesMessage(RecursionError, msg): @@ -555,7 +557,7 @@ def test_avoid_infinite_loop_on_too_many_subqueries(self): x = Tag.objects.filter(pk__in=x) def test_reasonable_number_of_subq_aliases(self): - x = Tag.objects.filter(pk=1) + x = Tag.objects.filter(pk="000000000000000000000001") for _ in range(20): x = Tag.objects.filter(pk__in=x) self.assertEqual( @@ -700,11 +702,13 @@ def test_ticket4358(self): self.assertIn("note_id", ExtraInfo.objects.values()[0]) # You can also pass it in explicitly. self.assertSequenceEqual( - ExtraInfo.objects.values("note_id"), [{"note_id": 1}, {"note_id": 2}] + ExtraInfo.objects.values("note_id"), + [{"note_id": self.n1.pk}, {"note_id": self.n2.pk}], ) # ...or use the field name. self.assertSequenceEqual( - ExtraInfo.objects.values("note"), [{"note": 1}, {"note": 2}] + ExtraInfo.objects.values("note"), + [{"note": self.n1.pk}, {"note": self.n2.pk}], ) def test_ticket6154(self): @@ -888,7 +892,9 @@ def test_ticket7235(self): self.assertSequenceEqual(q.all(), []) self.assertSequenceEqual(q.filter(meal="m"), []) self.assertSequenceEqual(q.exclude(meal="m"), []) - self.assertSequenceEqual(q.complex_filter({"pk": 1}), []) + self.assertSequenceEqual( + q.complex_filter({"pk": "000000000000000000000001"}), [] + ) self.assertSequenceEqual(q.select_related("food"), []) self.assertSequenceEqual(q.annotate(Count("food")), []) self.assertSequenceEqual(q.order_by("meal", "food"), []) @@ -940,7 +946,7 @@ def test_ticket9985(self): # qs.values_list(...).values(...) combinations should work. self.assertSequenceEqual( Note.objects.values_list("note", flat=True).values("id").order_by("id"), - [{"id": 1}, {"id": 2}, {"id": 3}], + [{"id": self.n1.pk}, {"id": self.n2.pk}, {"id": self.n3.pk}], ) self.assertSequenceEqual( Annotation.objects.filter( @@ -1833,8 +1839,8 @@ class Queries5Tests(TestCase): def setUpTestData(cls): # Ordering by 'rank' gives us rank2, rank1, rank3. Ordering by the # Meta.ordering will be rank3, rank2, rank1. - cls.n1 = Note.objects.create(note="n1", misc="foo", id=1) - cls.n2 = Note.objects.create(note="n2", misc="bar", id=2) + cls.n1 = Note.objects.create(note="n1", misc="foo") + cls.n2 = Note.objects.create(note="n2", misc="bar") e1 = ExtraInfo.objects.create(info="e1", note=cls.n1) e2 = ExtraInfo.objects.create(info="e2", note=cls.n2) a1 = Author.objects.create(name="a1", num=1001, extra=e1) @@ -2048,7 +2054,7 @@ def test_join_already_in_query(self): class DisjunctiveFilterTests(TestCase): @classmethod def setUpTestData(cls): - cls.n1 = Note.objects.create(note="n1", misc="foo", id=1) + cls.n1 = Note.objects.create(note="n1", misc="foo") cls.e1 = ExtraInfo.objects.create(info="e1", note=cls.n1) def test_ticket7872(self): @@ -2090,7 +2096,7 @@ def setUpTestData(cls): cls.t3 = Tag.objects.create(name="t3", parent=cls.t1) cls.t4 = Tag.objects.create(name="t4", parent=cls.t3) cls.t5 = Tag.objects.create(name="t5", parent=cls.t3) - n1 = Note.objects.create(note="n1", misc="foo", id=1) + n1 = Note.objects.create(note="n1", misc="foo") cls.ann1 = Annotation.objects.create(name="a1", tag=cls.t1) cls.ann1.notes.add(n1) cls.ann2 = Annotation.objects.create(name="a2", tag=cls.t4) @@ -2122,10 +2128,16 @@ def test_tickets_8921_9188(self): # preemptively discovered cases). self.assertSequenceEqual( - PointerA.objects.filter(connection__pointerb__id=1), [] + PointerA.objects.filter( + connection__pointerb__id="000000000000000000000001" + ), + [], ) self.assertSequenceEqual( - PointerA.objects.exclude(connection__pointerb__id=1), [] + PointerA.objects.exclude( + connection__pointerb__id="000000000000000000000001" + ), + [], ) self.assertSequenceEqual( @@ -2215,7 +2227,7 @@ def test_xor_subquery(self): class RawQueriesTests(TestCase): @classmethod def setUpTestData(cls): - Note.objects.create(note="n1", misc="foo", id=1) + Note.objects.create(note="n1", misc="foo") def test_ticket14729(self): # Test representation of raw query with one or few parameters passed as list @@ -2245,7 +2257,7 @@ def test_ticket10432(self): class ComparisonTests(TestCase): @classmethod def setUpTestData(cls): - cls.n1 = Note.objects.create(note="n1", misc="foo", id=1) + cls.n1 = Note.objects.create(note="n1", misc="foo") e1 = ExtraInfo.objects.create(info="e1", note=cls.n1) cls.a2 = Author.objects.create(name="a2", num=2002, extra=e1) @@ -2881,7 +2893,7 @@ def test_slicing_can_slice_again_after_slicing(self): def test_slicing_cannot_filter_queryset_once_sliced(self): msg = "Cannot filter a query once a slice has been taken." with self.assertRaisesMessage(TypeError, msg): - Article.objects.all()[0:5].filter(id=1) + Article.objects.all()[0:5].filter(name="foo") def test_slicing_cannot_reorder_queryset_once_sliced(self): msg = "Cannot reorder a query once a slice has been taken." @@ -3374,9 +3386,9 @@ class ExcludeTest17600(TestCase): @classmethod def setUpTestData(cls): # Create a few Orders. - cls.o1 = Order.objects.create(pk=1) - cls.o2 = Order.objects.create(pk=2) - cls.o3 = Order.objects.create(pk=3) + cls.o1 = Order.objects.create() + cls.o2 = Order.objects.create() + cls.o3 = Order.objects.create() # Create some OrderItems for the first order with homogeneous # status_id values @@ -3908,7 +3920,7 @@ class DisjunctionPromotionTests(TestCase): def test_disjunction_promotion_select_related(self): fk1 = FK1.objects.create(f1="f1", f2="f2") basea = BaseA.objects.create(a=fk1) - qs = BaseA.objects.filter(Q(a=fk1) | Q(b=2)) + qs = BaseA.objects.filter(Q(a=fk1) | Q(b="000000000000000000000002")) self.assertEqual(str(qs.query).count(" JOIN "), 0) qs = qs.select_related("a", "b") self.assertEqual(str(qs.query).count(" INNER JOIN "), 0) @@ -3964,7 +3976,9 @@ def test_disjunction_promotion3_demote(self): self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 1) def test_disjunction_promotion4_demote(self): - qs = BaseA.objects.filter(Q(a=1) | Q(a=2)) + qs = BaseA.objects.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) self.assertEqual(str(qs.query).count("JOIN"), 0) # Demote needed for the "a" join. It is marked as outer join by # above filter (even if it is trimmed away). @@ -3974,11 +3988,15 @@ def test_disjunction_promotion4_demote(self): def test_disjunction_promotion4(self): qs = BaseA.objects.filter(a__f1="foo") self.assertEqual(str(qs.query).count("INNER JOIN"), 1) - qs = qs.filter(Q(a=1) | Q(a=2)) + qs = qs.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) self.assertEqual(str(qs.query).count("INNER JOIN"), 1) def test_disjunction_promotion5_demote(self): - qs = BaseA.objects.filter(Q(a=1) | Q(a=2)) + qs = BaseA.objects.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) # Note that the above filters on a force the join to an # inner join even if it is trimmed. self.assertEqual(str(qs.query).count("JOIN"), 0) @@ -3990,12 +4008,16 @@ def test_disjunction_promotion5_demote(self): qs = BaseA.objects.filter(Q(a__f1="foo") | Q(b__f1="foo")) # Now the join to a is created as LOUTER self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 2) - qs = qs.filter(Q(a=1) | Q(a=2)) + qs = qs.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) self.assertEqual(str(qs.query).count("INNER JOIN"), 1) self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 1) def test_disjunction_promotion6(self): - qs = BaseA.objects.filter(Q(a=1) | Q(a=2)) + qs = BaseA.objects.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) self.assertEqual(str(qs.query).count("JOIN"), 0) qs = BaseA.objects.filter(Q(a__f1="foo") & Q(b__f1="foo")) self.assertEqual(str(qs.query).count("INNER JOIN"), 2) @@ -4004,12 +4026,16 @@ def test_disjunction_promotion6(self): qs = BaseA.objects.filter(Q(a__f1="foo") & Q(b__f1="foo")) self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 0) self.assertEqual(str(qs.query).count("INNER JOIN"), 2) - qs = qs.filter(Q(a=1) | Q(a=2)) + qs = qs.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) self.assertEqual(str(qs.query).count("INNER JOIN"), 2) self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 0) def test_disjunction_promotion7(self): - qs = BaseA.objects.filter(Q(a=1) | Q(a=2)) + qs = BaseA.objects.filter( + Q(a="000000000000000000000001") | Q(a="000000000000000000000002") + ) self.assertEqual(str(qs.query).count("JOIN"), 0) qs = BaseA.objects.filter(Q(a__f1="foo") | (Q(b__f1="foo") & Q(a__f1="bar"))) self.assertEqual(str(qs.query).count("INNER JOIN"), 1) @@ -4035,7 +4061,10 @@ def test_disjunction_promotion_fexpression(self): Q(a__f1=F("b__f1")) | Q(a__f2=F("b__f2")) | Q(c__f1="foo") ) self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 3) - qs = BaseA.objects.filter(Q(a__f1=F("c__f1")) | (Q(pk=1) & Q(pk=2))) + qs = BaseA.objects.filter( + Q(a__f1=F("c__f1")) + | (Q(pk="000000000000000000000001") & Q(pk="000000000000000000000002")) + ) self.assertEqual(str(qs.query).count("LEFT OUTER JOIN"), 2) self.assertEqual(str(qs.query).count("INNER JOIN"), 0) @@ -4397,7 +4426,7 @@ def test_ticket_21376(self): Q(objecta=a) | Q(objectb__objecta=a), ) qs = qs.filter( - Q(objectb=1) | Q(objecta=a), + Q(objectb="000000000000000000000001") | Q(objecta=a), ) self.assertEqual(qs.count(), 1) tblname = connection.ops.quote_name(ObjectB._meta.db_table) diff --git a/tests/queryset_pickle/tests.py b/tests/queryset_pickle/tests.py index 28079d2c86..9450a88239 100644 --- a/tests/queryset_pickle/tests.py +++ b/tests/queryset_pickle/tests.py @@ -58,7 +58,7 @@ def test_staticmethod_as_default(self): self.assert_pickles(Happening.objects.filter(number2=1)) def test_filter_reverse_fk(self): - self.assert_pickles(Group.objects.filter(event=1)) + self.assert_pickles(Group.objects.filter(event="000000000000000000000001")) def test_doesnotexist_exception(self): # Ticket #17776 @@ -97,7 +97,7 @@ def test_model_pickle(self): """ A model not defined on module level is picklable. """ - original = Container.SomeModel(pk=1) + original = Container.SomeModel(pk="000000000000000000000001") dumped = pickle.dumps(original) reloaded = pickle.loads(dumped) self.assertEqual(original, reloaded) @@ -176,7 +176,9 @@ def test_pickle_prefetch_queryset_still_usable(self): models.Prefetch("event_set", queryset=Event.objects.order_by("id")) ) groups2 = pickle.loads(pickle.dumps(groups)) - self.assertSequenceEqual(groups2.filter(id__gte=0), [g]) + self.assertSequenceEqual( + groups2.filter(id__gte="000000000000000000000000"), [g] + ) def test_pickle_prefetch_queryset_not_evaluated(self): Group.objects.create(name="foo") @@ -327,7 +329,7 @@ def test_annotation_values_list(self): def test_filter_deferred(self): qs = Happening.objects.all() qs._defer_next_filter = True - qs = qs.filter(id=0) + qs = qs.filter(id="000000000000000000000000") self.assert_pickles(qs) def test_missing_django_version_unpickling(self): diff --git a/tests/redirects_tests/tests.py b/tests/redirects_tests/tests.py index d175be62fb..0ca35ce720 100644 --- a/tests/redirects_tests/tests.py +++ b/tests/redirects_tests/tests.py @@ -12,7 +12,7 @@ "append": "django.contrib.redirects.middleware.RedirectFallbackMiddleware" } ) -@override_settings(APPEND_SLASH=False, ROOT_URLCONF="redirects_tests.urls", SITE_ID=1) +@override_settings(APPEND_SLASH=False, ROOT_URLCONF="redirects_tests.urls") class RedirectTests(TestCase): @classmethod def setUpTestData(cls): @@ -95,7 +95,6 @@ class OverriddenRedirectFallbackMiddleware(RedirectFallbackMiddleware): @modify_settings( MIDDLEWARE={"append": "redirects_tests.tests.OverriddenRedirectFallbackMiddleware"} ) -@override_settings(SITE_ID=1) class OverriddenRedirectMiddlewareTests(TestCase): @classmethod def setUpTestData(cls): diff --git a/tests/runtests.py b/tests/runtests.py index 6e0ed06d52..2b9d0c251b 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -14,6 +14,7 @@ from pathlib import Path import django_mongodb_backend +from bson import ObjectId try: import django @@ -246,7 +247,7 @@ def setup_collect_tests(start_at, start_after, test_labels=None): } ] settings.LANGUAGE_CODE = "en" - settings.SITE_ID = 1 + settings.SITE_ID = ObjectId("000000000000000000000001") settings.MIDDLEWARE = ALWAYS_MIDDLEWARE settings.MIGRATION_MODULES = { # This lets us skip creating migrations for the test models as many of @@ -262,6 +263,7 @@ def setup_collect_tests(start_at, start_after, test_labels=None): settings.LOGGING = log_config settings.SILENCED_SYSTEM_CHECKS = [ "fields.W342", # ForeignKey(unique=True) -> OneToOneField + "sites.E101", # SITE_ID must be an ObjectId for MongoDB. ] # Load all the ALWAYS_INSTALLED_APPS. diff --git a/tests/serializers/models/data.py b/tests/serializers/models/data.py index 212ea0e06f..f44a6c643b 100644 --- a/tests/serializers/models/data.py +++ b/tests/serializers/models/data.py @@ -7,6 +7,8 @@ import uuid +from django_mongodb_backend.fields import ObjectIdField + from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType from django.db import models @@ -103,7 +105,7 @@ class Tag(models.Model): data = models.SlugField() content_type = models.ForeignKey(ContentType, models.CASCADE) - object_id = models.PositiveIntegerField() + object_id = ObjectIdField() content_object = GenericForeignKey() diff --git a/tests/serializers/test_data.py b/tests/serializers/test_data.py index 33ea3458de..2700e5ec1c 100644 --- a/tests/serializers/test_data.py +++ b/tests/serializers/test_data.py @@ -11,6 +11,8 @@ import decimal import uuid +from bson import ObjectId + from django.core import serializers from django.db import connection, models from django.test import TestCase @@ -75,6 +77,16 @@ ) from .tests import register_tests + +def prep_value(value): + """Format a data value for MongoDB (convert int to ObjectId).""" + return f"{value:024}" if isinstance(value, int) else value + + +def value_to_object_id(value): + return ObjectId(f"{value:024}") if isinstance(value, int) else value + + # A set of functions that can be used to recreate # test data objects of various kinds. # The save method is a raw base model save, to make @@ -100,7 +112,7 @@ def generic_create(pk, klass, data): def fk_create(pk, klass, data): instance = klass(id=pk) - setattr(instance, "data_id", data) + setattr(instance, "data_id", prep_value(data)) models.Model.save_base(instance, raw=True) return [instance] @@ -108,7 +120,7 @@ def fk_create(pk, klass, data): def m2m_create(pk, klass, data): instance = klass(id=pk) models.Model.save_base(instance, raw=True) - instance.data.set(data) + instance.data.set([f"{d:024}" for d in data]) return [instance] @@ -120,8 +132,10 @@ def im2m_create(pk, klass, data): def im_create(pk, klass, data): instance = klass(id=pk) - instance.right_id = data["right"] - instance.left_id = data["left"] + instance.right_id = ( + f'{data["right"]:024}' # if data is not None else data # data["right"] + ) + instance.left_id = f'{data["left"]:024}' if "extra" in data: instance.extra = data["extra"] models.Model.save_base(instance, raw=True) @@ -130,7 +144,7 @@ def im_create(pk, klass, data): def o2o_create(pk, klass, data): instance = klass() - instance.data_id = data + instance.data_id = f"{data:024}" if data is not None else data models.Model.save_base(instance, raw=True) return [instance] @@ -166,7 +180,7 @@ def data_compare(testcase, pk, klass, data): testcase.assertEqual( bytes(data), bytes(instance.data), - "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" + "Objects with PK=%s not equal; expected '%s' (%s), got '%s' (%s)" % ( pk, repr(bytes(data)), @@ -179,7 +193,7 @@ def data_compare(testcase, pk, klass, data): testcase.assertEqual( data, instance.data, - "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" + "Objects with PK=%s not equal; expected '%s' (%s), got '%s' (%s)" % ( pk, data, @@ -198,12 +212,15 @@ def generic_compare(testcase, pk, klass, data): def fk_compare(testcase, pk, klass, data): instance = klass.objects.get(id=pk) - testcase.assertEqual(data, instance.data_id) + testcase.assertEqual(value_to_object_id(data), instance.data_id) def m2m_compare(testcase, pk, klass, data): instance = klass.objects.get(id=pk) - testcase.assertEqual(data, [obj.id for obj in instance.data.order_by("id")]) + testcase.assertEqual( + [value_to_object_id(d) for d in data], + [obj.id for obj in instance.data.order_by("id")], + ) def im2m_compare(testcase, pk, klass, data): @@ -213,8 +230,8 @@ def im2m_compare(testcase, pk, klass, data): def im_compare(testcase, pk, klass, data): instance = klass.objects.get(id=pk) - testcase.assertEqual(data["left"], instance.left_id) - testcase.assertEqual(data["right"], instance.right_id) + testcase.assertEqual(value_to_object_id(data["left"]), instance.left_id) + testcase.assertEqual(value_to_object_id(data["right"]), instance.right_id) if "extra" in data: testcase.assertEqual(data["extra"], instance.extra) else: @@ -222,8 +239,8 @@ def im_compare(testcase, pk, klass, data): def o2o_compare(testcase, pk, klass, data): - instance = klass.objects.get(data=data) - testcase.assertEqual(data, instance.data_id) + instance = klass.objects.get(data=prep_value(data)) + testcase.assertEqual(value_to_object_id(data), instance.data_id) def pk_compare(testcase, pk, klass, data): @@ -449,7 +466,7 @@ def serializerTest(self, format): instance_count = {} for func, pk, klass, datum in test_data: with connection.constraint_checks_disabled(): - objects.extend(func[0](pk, klass, datum)) + objects.extend(func[0](prep_value(pk), klass, datum)) # Get a count of the number of objects created for each class for klass in instance_count: @@ -467,7 +484,7 @@ def serializerTest(self, format): # Assert that the deserialized data is the same # as the original source for func, pk, klass, datum in test_data: - func[1](self, pk, klass, datum) + func[1](self, prep_value(pk), klass, datum) # Assert that the number of objects deserialized is the # same as the number that was serialized. diff --git a/tests/serializers/test_json.py b/tests/serializers/test_json.py index 6d67bfdb43..42afec4ca7 100644 --- a/tests/serializers/test_json.py +++ b/tests/serializers/test_json.py @@ -121,8 +121,9 @@ def test_helpful_error_message_invalid_field(self): If there is an invalid field value, the error message should contain the model associated with it. """ + pk = "000000000000000000000001" test_string = """[{ - "pk": "1", + "pk": "000000000000000000000001", "model": "serializers.player", "fields": { "name": "Bob", @@ -130,7 +131,7 @@ def test_helpful_error_message_invalid_field(self): "team": "Team" } }]""" - expected = "(serializers.player:pk=1) field_value was 'invalidint'" + expected = f"(serializers.player:pk={pk}) field_value was 'invalidint'" with self.assertRaisesMessage(DeserializationError, expected): list(serializers.deserialize("json", test_string)) @@ -139,8 +140,9 @@ def test_helpful_error_message_for_foreign_keys(self): Invalid foreign keys with a natural key should throw a helpful error message, such as what the failing key is. """ + pk = "000000000000000000000001" test_string = """[{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.category", "fields": { "name": "Unknown foreign key", @@ -151,7 +153,7 @@ def test_helpful_error_message_for_foreign_keys(self): } }]""" key = ["doesnotexist", "metadata"] - expected = "(serializers.category:pk=1) field_value was '%r'" % key + expected = f"(serializers.category:pk={pk}) field_value was '%r'" % key with self.assertRaisesMessage(DeserializationError, expected): list(serializers.deserialize("json", test_string)) @@ -159,29 +161,30 @@ def test_helpful_error_message_for_many2many_non_natural(self): """ Invalid many-to-many keys should throw a helpful error message. """ + pk = "000000000000000000000001" test_string = """[{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { - "author": 1, + "author": "000000000000000000000001", "headline": "Unknown many to many", "pub_date": "2014-09-15T10:35:00", - "categories": [1, "doesnotexist"] + "categories": ["000000000000000000000001", "doesnotexist"] } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": { "name": "Agnes" } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.category", "fields": { "name": "Reference" } }]""" - expected = "(serializers.article:pk=1) field_value was 'doesnotexist'" + expected = f"(serializers.article:pk={pk}) field_value was 'doesnotexist'" with self.assertRaisesMessage(DeserializationError, expected): list(serializers.deserialize("json", test_string)) @@ -191,7 +194,7 @@ def test_helpful_error_message_for_many2many_natural1(self): This tests the code path where one of a list of natural keys is invalid. """ test_string = """[{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.categorymetadata", "fields": { "kind": "author", @@ -199,10 +202,10 @@ def test_helpful_error_message_for_many2many_natural1(self): "value": "Agnes" } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { - "author": 1, + "author": "000000000000000000000001", "headline": "Unknown many to many", "pub_date": "2014-09-15T10:35:00", "meta_data": [ @@ -212,14 +215,17 @@ def test_helpful_error_message_for_many2many_natural1(self): ] } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": { "name": "Agnes" } }]""" key = ["doesnotexist", "meta1"] - expected = "(serializers.article:pk=1) field_value was '%r'" % key + expected = ( + "(serializers.article:pk=000000000000000000000001) field_value was '%r'" + % key + ) with self.assertRaisesMessage(DeserializationError, expected): for obj in serializers.deserialize("json", test_string): obj.save() @@ -230,17 +236,18 @@ def test_helpful_error_message_for_many2many_natural2(self): tests the code path where a natural many-to-many key has only a single value. """ + pk = "000000000000000000000001" test_string = """[{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { - "author": 1, + "author": "000000000000000000000001", "headline": "Unknown many to many", "pub_date": "2014-09-15T10:35:00", - "meta_data": [1, "doesnotexist"] + "meta_data": ["000000000000000000000001", "doesnotexist"] } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.categorymetadata", "fields": { "kind": "author", @@ -248,13 +255,13 @@ def test_helpful_error_message_for_many2many_natural2(self): "value": "Agnes" } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": { "name": "Agnes" } }]""" - expected = "(serializers.article:pk=1) field_value was 'doesnotexist'" + expected = f"(serializers.article:pk={pk}) field_value was 'doesnotexist'" with self.assertRaisesMessage(DeserializationError, expected): for obj in serializers.deserialize("json", test_string, ignore=False): obj.save() @@ -263,13 +270,14 @@ def test_helpful_error_message_for_many2many_not_iterable(self): """ Not iterable many-to-many field value throws a helpful error message. """ + pk = "000000000000000000000001" test_string = """[{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.m2mdata", "fields": {"data": null} }]""" - expected = "(serializers.m2mdata:pk=1) field_value was 'None'" + expected = f"(serializers.m2mdata:pk={pk}) field_value was 'None'" with self.assertRaisesMessage(DeserializationError, expected): next(serializers.deserialize("json", test_string, ignore=False)) @@ -280,24 +288,24 @@ class JsonSerializerTransactionTestCase( serializer_name = "json" fwd_ref_str = """[ { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { "headline": "Forward references pose no problem", "pub_date": "2006-06-16T15:00:00", - "categories": [1], - "author": 1 + "categories": ["000000000000000000000001"], + "author": "000000000000000000000001" } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.category", "fields": { "name": "Reference" } }, { - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": { "name": "Agnes" diff --git a/tests/serializers/test_jsonl.py b/tests/serializers/test_jsonl.py index 73fe725602..bb6e861df6 100644 --- a/tests/serializers/test_jsonl.py +++ b/tests/serializers/test_jsonl.py @@ -104,11 +104,12 @@ def test_helpful_error_message_invalid_field(self): If there is an invalid field value, the error message contains the model associated with it. """ + pk = "000000000000000000000001" test_string = ( - '{"pk": "1","model": "serializers.player",' - '"fields": {"name": "Bob","rank": "invalidint","team": "Team"}}' + '{"pk": "%s","model": "serializers.player",' + '"fields": {"name": "Bob","rank": "invalidint","team": "Team"}}' % pk ) - expected = "(serializers.player:pk=1) field_value was 'invalidint'" + expected = f"(serializers.player:pk={pk}) field_value was 'invalidint'" with self.assertRaisesMessage(DeserializationError, expected): list(serializers.deserialize("jsonl", test_string)) @@ -117,14 +118,15 @@ def test_helpful_error_message_for_foreign_keys(self): Invalid foreign keys with a natural key throws a helpful error message, such as what the failing key is. """ + pk = "000000000000000000000001" test_string = ( - '{"pk": 1, "model": "serializers.category",' + '{"pk": "000000000000000000000001", "model": "serializers.category",' '"fields": {' '"name": "Unknown foreign key",' '"meta_data": ["doesnotexist","metadata"]}}' ) key = ["doesnotexist", "metadata"] - expected = "(serializers.category:pk=1) field_value was '%r'" % key + expected = f"(serializers.category:pk={pk}) field_value was '%r'" % key with self.assertRaisesMessage(DeserializationError, expected): list(serializers.deserialize("jsonl", test_string)) @@ -132,30 +134,31 @@ def test_helpful_error_message_for_many2many_non_natural(self): """ Invalid many-to-many keys throws a helpful error message. """ + pk = "000000000000000000000001" test_strings = [ """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { - "author": 1, + "author": "000000000000000000000001", "headline": "Unknown many to many", "pub_date": "2014-09-15T10:35:00", - "categories": [1, "doesnotexist"] + "categories": ["000000000000000000000001", "doesnotexist"] } }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": {"name": "Agnes"} }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.category", "fields": {"name": "Reference"} }""", ] test_string = "\n".join([s.replace("\n", "") for s in test_strings]) - expected = "(serializers.article:pk=1) field_value was 'doesnotexist'" + expected = f"(serializers.article:pk={pk}) field_value was 'doesnotexist'" with self.assertRaisesMessage(DeserializationError, expected): list(serializers.deserialize("jsonl", test_string)) @@ -164,17 +167,18 @@ def test_helpful_error_message_for_many2many_natural1(self): Invalid many-to-many keys throws a helpful error message where one of a list of natural keys is invalid. """ + pk = "000000000000000000000001" test_strings = [ """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.categorymetadata", "fields": {"kind": "author","name": "meta1","value": "Agnes"} }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { - "author": 1, + "author": "000000000000000000000001", "headline": "Unknown many to many", "pub_date": "2014-09-15T10:35:00", "meta_data": [ @@ -185,14 +189,14 @@ def test_helpful_error_message_for_many2many_natural1(self): } }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": {"name": "Agnes"} }""", ] test_string = "\n".join([s.replace("\n", "") for s in test_strings]) key = ["doesnotexist", "meta1"] - expected = "(serializers.article:pk=1) field_value was '%r'" % key + expected = f"(serializers.article:pk={pk}) field_value was '%r'" % key with self.assertRaisesMessage(DeserializationError, expected): for obj in serializers.deserialize("jsonl", test_string): obj.save() @@ -202,30 +206,31 @@ def test_helpful_error_message_for_many2many_natural2(self): Invalid many-to-many keys throws a helpful error message where a natural many-to-many key has only a single value. """ + pk = "000000000000000000000001" test_strings = [ """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { - "author": 1, + "author": "000000000000000000000001", "headline": "Unknown many to many", "pub_date": "2014-09-15T10:35:00", - "meta_data": [1, "doesnotexist"] + "meta_data": ["000000000000000000000001", "doesnotexist"] } }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.categorymetadata", "fields": {"kind": "author","name": "meta1","value": "Agnes"} }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": {"name": "Agnes"} }""", ] test_string = "\n".join([s.replace("\n", "") for s in test_strings]) - expected = "(serializers.article:pk=1) field_value was 'doesnotexist'" + expected = f"(serializers.article:pk={pk}) field_value was 'doesnotexist'" with self.assertRaisesMessage(DeserializationError, expected): for obj in serializers.deserialize("jsonl", test_string, ignore=False): obj.save() @@ -248,22 +253,22 @@ class JsonSerializerTransactionTestCase( serializer_name = "jsonl" fwd_ref_str = [ """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.article", "fields": { "headline": "Forward references pose no problem", "pub_date": "2006-06-16T15:00:00", - "categories": [1], - "author": 1 + "categories": ["000000000000000000000001"], + "author": "000000000000000000000001" } }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.category", "fields": {"name": "Reference"} }""", """{ - "pk": 1, + "pk": "000000000000000000000001", "model": "serializers.author", "fields": {"name": "Agnes"} }""", diff --git a/tests/serializers/test_natural.py b/tests/serializers/test_natural.py index b5b35708c6..cf9d292374 100644 --- a/tests/serializers/test_natural.py +++ b/tests/serializers/test_natural.py @@ -21,9 +21,15 @@ def natural_key_serializer_test(self, format): # Create all the objects defined in the test data with connection.constraint_checks_disabled(): objects = [ - NaturalKeyAnchor.objects.create(id=1100, data="Natural Key Anghor"), - FKDataNaturalKey.objects.create(id=1101, data_id=1100), - FKDataNaturalKey.objects.create(id=1102, data_id=None), + NaturalKeyAnchor.objects.create( + id="000000000000000000001100", data="Natural Key Anghor" + ), + FKDataNaturalKey.objects.create( + id="000000000000000000001101", data_id="000000000000000000001100" + ), + FKDataNaturalKey.objects.create( + id="000000000000000000001102", data_id=None + ), ] # Serialize the test database serialized_data = serializers.serialize( @@ -40,7 +46,7 @@ def natural_key_serializer_test(self, format): self.assertEqual( obj.data, instance.data, - "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" + "Objects with PK=%s not equal; expected '%s' (%s), got '%s' (%s)" % ( obj.pk, obj.data, diff --git a/tests/serializers/test_xml.py b/tests/serializers/test_xml.py index c9df2f2a5b..e7d8671c63 100644 --- a/tests/serializers/test_xml.py +++ b/tests/serializers/test_xml.py @@ -97,18 +97,18 @@ class XmlSerializerTransactionTestCase( serializer_name = "xml" fwd_ref_str = """