Отображение поля выбора в админке как поле ввода

У меня есть база данных, состоящая, возможно, из 100 пользователей, у каждого из которых есть 5-10k продуктов, связанных с ними. В панели администратора я могу сделать проверку на функцию для отображения этих продуктов, и это работает просто отлично, но загрузка этой страницы очень медленная из-за большого количества продуктов. Поэтому я хочу заменить ее на regex или хотя бы на поле ввода числа, которое не будет предварительно загружать все продукты:

модели:

class Store(models.Model):
    name = models.CharField("name", max_length = 128)
    city = models.CharField("city", max_length = 30, null = True, blank = True)
    store_id = models.IntegerField("store id", unique = True)
    user = models.OneToOneField(User, on_delete = models.CASCADE, )

class Product(models.Model):
    data = models.JSONField()
    store = models.ForeignKey(Store, on_delete = models.CASCADE)
    number = models.PositiveIntegerField()

admin:

class ProductTabularInline(admin.TabularInline):
    model = Product

class StoreAdmin(admins.ModelAdmin):
    inlines = [ProductTabluarInline,]

В админ панели сейчас у меня есть TabularInline для Product, который отображает все продукты при нажатии на магазин в виде выпадающего списка (Что означает, что они должны быть предварительно загружены сначала, очевидно). Есть ли простой способ изменить это на ввод числа (number ключ товара, но даже pk мне бы помог), или еще лучше regex? Могу ли я просто сделать это, назначив form на TabularInline?

Как уже упоминал Jaap Joris Vens, вы можете попробовать использовать raw_id_fields в вашем TabularInline следующим образом, чтобы предотвратить загрузку магазинов, выпадающих для inline(OFFICIAL DOCS):

class ProductTabularInline(admin.TabularInline):
    model = Product
    raw_id_fields = ('store',)

Но насколько я понял (поправьте меня, если я ошибаюсь, потому что я немного запутался в вашем описании отношений модель-админ), проблема не в выпадающем списке "магазин", а во многих Продуктах (из-за inline в админке магазина), так что вам действительно нужен inline для этого? (потому что inline в основном используется для поточного редактирования, что не очень удобно, когда есть много связанных объектов)

Я предлагаю выводить продукты на странице магазина вручную, добавляя продукты магазина в extra_context модели StoreAdmin и переопределяя шаблон change_view следующим образом (DOCS):

class StoreAdmin(admins.ModelAdmin):
    change_form_template = "admin/app_name/store_change_form.html"

    def get_store_products(store: Store):
        return Products.objects.filter(store=store)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        store_instance= self.get_object(request, object_id)
        extra_context = extra_context or {}
        extra_context['products'] = self.get_store_products(store_instance)
        return super().change_view(request, object_id, form_url, extra_context=extra_context,)

После этого вы можете изменить шаблон магазина в админке, чтобы отображать продукты так, как вы хотите (не забудьте добавить url для страницы редактирования каждого продукта):

    #store_change_view.html

    {% extends 'admin/change_form.html' %}
    
    {% block content %}
    {{ block.super }}
         {% for product in products %}
           <p>
             <a href="{% url 'admin:products_change' product.id %}">product.number</a>
           </p>
         {% endfor %}
{% endblock %}
Вернуться на верх