Администратор Django меняет форму загрузки довольно медленно

На одном из моих сайтов Django есть следующие модели баз данных: В приложении Django «common»:

class Collection(models.Model): name = models.CharField(max_length = 255, unique = True) _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) class Particle(models.Model): content = models.TextField(blank=False) owner = models.ForeignKey(Collection) order = models.IntegerField(null=True, blank=True) 

В Django App "sitcom":

 class Media(models.Model): name = models.CharField(max_length = 248) _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) capital = models.CharField(max_length = 1) description = models.TextField(blank=True) progress = models.CharField(max_length = 32, blank=True, null=True) class Relation(models.Model): name = models.CharField(max_length = 128) _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) description = models.TextField(blank=True) parent = models.ForeignKey('self', blank=True, null=True) order = models.IntegerField(blank=True, null=True) particle = models.ForeignKey(Particle, blank=True, null=True) media = models.ForeignKey(Media, blank=True, null=True) 

Короче говоря, модель класса Relation имеет 3 внешних ключа к другим таблицам. Проблема в том, что когда я использую Django Admin для изменения одного отношения, страница (change_form) загружается довольно медленно. Позднее я изменил модельный класс Relation следующим образом:

 class Relation(models.Model): name = models.CharField(max_length = 128) _short_name = models.CharField(db_column="short_name", max_length = 32, blank=True) description = models.TextField(blank=True) order = models.IntegerField(blank=True, null=True) parent_id = models.IntegerField(blank=True, null=True) particle_id = models.IntegerField(blank=True, null=True) media_id = models.IntegerField(blank=True, null=True) 

Модификация изменила внешние ключи на IntegerFields, поэтому она отключила некоторые магии в системе Django ORM, и теперь страница смены формы загружается очень быстро. Мой вопрос в том, что такое «инвалидная магия внутри джанго орма»? что может вызвать проблему?

4 Solutions collect form web for “Администратор Django меняет форму загрузки довольно медленно”

Это не волшебство Ордена Дженго. Это волшебство Формы. Когда вы создаете внешний ключ в модели, то в ModelForm создается ModelChoiceField, который имеет все варианты модели ForeignKey. И django Admin использует все свойства формы для создания HTML. Поэтому используйте этот код.

 from django import forms class RelationForm(forms.ModelForm): parent = forms.ChoiceField(required=False, choices=Relation.objects.values_list('id', 'name')) particle = forms.ChoiceField(required=False, choices=Particle.objects.values_list('id', 'content')) media = forms.ChoiceField(required=False, choices=Media.objects.values_list('id', 'name')) class Meta: model = Relation 

На сайте Admis

 from django.contrib import admin class RelationAdmin(admin.ModelAdmin): form = RelationForm model = Relation 

Вы также можете кэшировать выбор в форме.

В admin.py

 from django.contrib import admin class RelationAdmin(admin.ModelAdmin): raw_id_fields = ('Media','Particle',) admin.site.register(Relation, RelationAdmin) 

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

Я готов поспорить, что проблема связана с вашим ForeignKey . По умолчанию django отображает элемент <select> для каждого внешнего ключа.

Если у вас тысячи строк, это легко начнет раздувать ваш HTML / DOM, и я заметил, что браузеры начинают выкапывать из 20 тыс. Элементов, отображаемых в <select> .

Чтобы исправить это, обратите внимание на переопределение формы администратора, а не на использование виджетов по умолчанию.

Если в ForeignKey Model слишком много записей, это может заморозить вашу форму редактирования. Лучший способ начать – ограничить поля, которые должны отображаться в форме, и постепенно / поочередно добавлять другие поля, проверяя, какое поле делает форму медленной.

 from django.contrib import admin class RelationAdmin(admin.ModelAdmin): fields = ('name',) admin.site.register(Relation, RelationAdmin) 

Затем, после добавления поля, которое вызывает проблему, например Media, форма снова замерзнет. Поэтому, если вам все еще нужно это поле в форме, вы можете использовать ответ Vishal Shah с raw_id_fields = ('Media',)

  • While-loop с if-statement быстрее, чем while-loop
  • Разница между производительностью или стилем между «if» и «if not»?
  • Массовая строка заменяется на python?
  • Ускорьте функцию NumPy, где функция
  • Ускорьте Pandas cummin / cummax
  • Почему реализация JITted Python все еще медленная?
  • Свяжите ATLAS / MKL с установленным Numpy
  • Записывает ли журнал python каждый журнал?
  • Python - лучший язык программирования в мире.