Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions django/contrib/admin/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -474,24 +474,24 @@ def lookup_allowed(self, lookup, value, request=None):
# Lookups on nonexistent fields are ok, since they're ignored
# later.
break
if not prev_field or (
prev_field.is_relation
and field not in model._meta.parents.values()
and field is not model._meta.auto_field
and (
model._meta.auto_field is None
or part not in getattr(prev_field, "to_fields", [])
)
):
relation_parts.append(part)
if not getattr(field, "path_infos", None):
# This is not a relational field, so further parts
# must be transforms.
break
if (
not prev_field
or (field.is_relation and field not in model._meta.parents.values())
or (
prev_field.is_relation
and model._meta.auto_field is None
and part not in getattr(prev_field, "to_fields", [])
)
):
relation_parts.append(part)
prev_field = field
model = field.path_infos[-1].to_opts.model

if len(relation_parts) <= 1:
if not relation_parts:
# Either a local field filter, or no fields at all.
return True
valid_lookups = {self.date_hierarchy}
Expand Down
4 changes: 3 additions & 1 deletion docs/releases/5.0.1.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ Django 5.0.1 fixes several bugs in 5.0.
Bugfixes
========

* ...
* Reallowed, following a regression in Django 5.0, using a foreign key to a
model with a primary key that is not ``AutoField`` in
:attr:`.ModelAdmin.list_filter` (:ticket:`35020`).
14 changes: 14 additions & 0 deletions tests/modeladmin/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,20 @@ class EmployeeProfileAdmin(ModelAdmin):
True,
)

@isolate_apps("modeladmin")
def test_lookup_allowed_non_autofield_primary_key(self):
class Country(models.Model):
id = models.CharField(max_length=2, primary_key=True)

class Place(models.Model):
country = models.ForeignKey(Country, models.CASCADE)

class PlaceAdmin(ModelAdmin):
list_filter = ["country"]

ma = PlaceAdmin(Place, self.site)
self.assertIs(ma.lookup_allowed("country__id__exact", "DE", request), True)

@isolate_apps("modeladmin")
def test_lookup_allowed_foreign_primary(self):
class Country(models.Model):
Expand Down