Django admin search function in GenerifForeignkey field with Content_object relation
I am trying to build an admin page that lets admins search through 2 fields of the model "SeasonalitiesCalculated". The fields for my search are called "fruit" and "object_id".
"fruit" is a Foreignkey field and returns the "name" field of the corresponding fruit.
"object_id" is Genericforeignkey field that sometimes points at a UUID in a model called "Countries" (with a "country_name" field: Germany) and sometimes points at a UUID in a model called "AdminZones" (with an "admin_zone_name" field: California)
The problem now is that django seems to not have any standard way of searching through GenericForeignkeys. So I tried defining a search function like this:
class SeasonalitiesCalculatedAdmin(admin.ModelAdmin): list_per_page = 20 def country_or_admin_zone_name(self, obj): return obj.country_or_admin_zone_name() country_or_admin_zone_name.short_description = 'Country or Admin Zone' def search_field(self, obj): return obj.search_field() list_display = ('fruit', 'country_or_admin_zone_name', 'content_type', ...) search_fields = ('fruit__fruit_name', 'search_fields')
the admin page itself works and it also shows the country or admin zone names and other foreignkey related fields properly since I specified this in the SeasonalitiesCalculated model like this
class SeasonalitiesCalculated(LoggingMixinSeasons, Basemodel): fruit = models.ForeignKey('IngredientOriginals', on_delete=models.PROTECT, related_name='%(class)s_related_ingredient_original') content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT) object_id = models.UUIDField(default=uuid.uuid4, editable=False) content_object = GenericForeignKey('content_type', 'object_id') ... class Meta: managed = True db_table = 'seasonalities_calculated' verbose_name_plural = 'Seasonalities Calculated' constraints = [models.UniqueConstraint(fields=['ingredient_original_id', 'content_type_id', 'object_id',], name='unique_seasonalities_calculated')] def country_or_admin_zone_name(self): content_object = self.content_object if isinstance(content_object, Countries): return content_object.country_name elif isinstance(content_object, AdminZones1): return content_object.admin_zone_1_name else: return None def search_field(self): content_object = self.content_object if isinstance(content_object, Countries): return 'content_object__country_name' elif isinstance(content_object, AdminZones1): return 'content_object__admin_zone_1_name' return None
but i just cant figure out how to make the search_fields work becuase of the content object relation.
i tried overriding the standard search query but without success...
any help is much appreciated