Функция поиска в админке 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
но я просто не могу понять, как сделать так, чтобы поля поиска работали из-за связи с объектом контента.
я пробовал переопределить стандартный поисковый запрос, но безуспешно...
любая помощь будет очень признательна