Функция поиска в админке Django в поле GenerifForeignkey с отношением Content_object

Я пытаюсь создать страницу администратора, которая позволяет администраторам искать по 2 полям модели "SeasonalitiesCalculated". Поля для моего поиска называются "fruit" и "object_id".

"fruit" является полем Foreignkey и возвращает поле "name" соответствующего фрукта.

"object_id" - это поле Genericforeignkey, которое иногда указывает на UUID в модели "Countries" (с полем "country_name": Germany), а иногда указывает на UUID в модели "AdminZones" (с полем "admin_zone_name": California)

Проблема в том, что в django, похоже, нет стандартного способа поиска по GenericForeignkeys. Поэтому я попробовал определить функцию поиска следующим образом:

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')

сама страница администратора работает, и она также правильно отображает названия стран или зон администратора и другие поля, связанные с иностранными ключами, поскольку я указал это в модели SeasonalitiesCalculated следующим образом

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

но я просто не могу понять, как сделать так, чтобы поля поиска работали из-за связи с объектом контента.

я пробовал переопределить стандартный поисковый запрос, но безуспешно...

любая помощь будет очень признательна

Вернуться на верх