Django Admin tabularInline очень медленный запрос - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть приложение Location в моем проекте. Есть список стран, их штатов и городов.

model.py

class Country(models.Model):
    class Meta:
        verbose_name = 'Country'
        verbose_name_plural = 'Countries'
        unique_together = ['name', 'iso2'],

    name = models.CharField(
        max_length=255,
        verbose_name=_('Country name'),
    )

    iso2 = models.CharField(
        max_length=2,
        null=True,
        blank=True,
        verbose_name=_('iso2'),
    )

    phone_code = models.CharField(
        max_length=15,
        null=True,
        blank=True,
        verbose_name=_('Phone code'),
    )

    def __str__(self):
        return self.name


class State(models.Model):
    name = models.CharField(
        max_length=100,
        verbose_name=_('State'),
    )

    country = models.ForeignKey(
        Country,
        on_delete=models.SET_NULL,
        verbose_name=_('Country'),
        related_name='states',
        related_query_name='states',
        null=True,
    )

    state_code = models.CharField(
        max_length=20,
        null=True,
        blank=True,
        verbose_name=_('State code'),
    )

    def __str__(self):
        return self.name


class City(models.Model):
    name = models.CharField(
        max_length=70,
        verbose_name=_('City name'),
    )

    state = models.ForeignKey(
        State,
        on_delete=models.SET_NULL,
        null=True,
        verbose_name=_('State'),
        related_name='cities',
        related_query_name='cities',
    )

    country = models.ForeignKey(
        Country,
        on_delete=models.SET_NULL,
        verbose_name=_('Country'),
        related_name='cities',
        related_query_name='cities',
        null=True,
    )

    def __str__(self):
        return self.name

Я пытаюсь получить список городов стран в Django admin через Tabular inline, но когда Я нажимаю на любую страну, она загружается очень медленно (около 1 минуты). Как это оптимизировать? Когда я сделал это в Shell - Country.objects.get(name='USA').cities.all() он возвращает результаты менее 10 мс

admin.py

from .models import Country, City


class CountryCitiesAdmin(admin.TabularInline):
    model = City


class CountryAdmin(admin.ModelAdmin):
    inlines = (CountryCitiesAdmin,)
    list_display = ('name', 'iso2', 'phone_code')
    search_fields = ('name', 'code', 'phone_code',)


admin.site.register(Country, CountryAdmin)

1 Ответ

1 голос
/ 22 апреля 2020

Возможно, вам придется использовать свойство raw_id_fields. Происходит то, что он вытягивает все возможные значения для заполнения элемента select html. Установка raw_id_fields = ['country', 'state'] сделает его вводом, который показывает идентификатор экземпляра.

...