Добавление фильтров к полям автозаполнения в django

У меня вопрос об автозаполнении полей в django.

Предположим, что у нас есть эти 2 модели:

class Animal:     
    name = models.CharField()     
    is_big = models.BooleanField()  

class Human:     
    pet = models.ForeignKey(Animal)

Затем у нас есть файл администратора, который выглядит примерно так:

class HumanAdmin(admin.ModelAdmin):
    autocomplete_fields = ['pet']

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'pet':
            kwargs["queryset"] = Animal.objects.filter(is_big=True)
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

class AnimalAdmin(admin.ModelAdmin):
    search_fields = ['name']

admin.site.register(Animal, AnimalAdmin)
admin.site.register(Human, HumanAdmin)

Я хотел добиться того, чтобы в выпадающем списке выбора животных были только крупные животные, что сработало, и затем я решил сделать этот список автозаполняемым, но после того, как я сделал его автозаполняемым, похоже, что он игнорирует мой фильтр formfield_for_foreignkey, теперь он загружает всех животных.

И я хочу спросить, как мне правильно объединить эти два варианта? Мне нужно поле автозаполнения для животных, но я хочу, чтобы оно учитывало только тех, у кого есть is_big == True .

Моя идея заключается в том, что я должен каким-то образом перехватить то, что вводится в текстовом поле автозаполнения, и добавить это в мою фильтрацию, но я не уверен, как это сделать.

Попытка отменить get_search_result внутри AnimalAdmin

class AnimalAdmin(admin.ModelAdmin):
    search_fields = ['name']

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(
            request,
            queryset,
            search_term,
        )
        queryset = queryset.filter(is_big=True)

        return queryset, use_distinct


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