I'm trying to filter in Django Admin on an annotated field, but getting a FieldDoesNotExist error.
class Event(models.Model):
name = models.CharField(max_length=50, blank=True)
class EventSession(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
start_date = models.DateTimeField()
end_date = models.DateTimeField()
@admin.register(Event)
class EventAdmin(admin.ModelAdmin):
ordering = ["event_start_date"]
list_filter = ["event_start_date", "event_end_date"]
def get_queryset(self, request):
qs = super().get_queryset(request)
qs = qs.annotate(
event_start_date=Min("eventsession_set__start_date"), # start of first day
event_end_date=Max("eventsession_set__start_date"), # start of last day
)
return qs
The resulting error in Django Admin is:
FieldDoesNotExist at /admin/events/event/
Event has no field named 'event_start_date'
I need to filter on event_start_date rather than eventsession_set__start_date because filtering ordering (edit) on the latter causes multiples rows per event (one for each session) to show up in the list view.
The error comes from the get_field method of django/db/models/options.py:
try:
# Retrieve field instance by name from cached or just-computed
# field map.
return self.fields_map[field_name]
except KeyError:
raise FieldDoesNotExist("%s has no field named '%s'" % (self.object_name, field_name))
I'm on Django 3.2. Any ideas?