Несколько запросов для встроенных экземпляров Django admin - PullRequest
0 голосов
/ 20 ноября 2018

Я создал собственного администратора для одной из моих моделей.И добавил реляционную таблицу как одну из встроенных.

1).Теперь дело в том, что Inline имеет более 100 строк.Кроме того, у встроенного объекта есть объект внешнего ключа для какой-либо другой модели.

2). Всякий раз, когда я загружаю форму модели, для загрузки требуется много времени.

3). Я отлаживал и проверял код и количество запросов.Ни один запрос не был продублирован, и количество было номинальным.

4). Я переопределил набор запросов для встроенного экземпляра, чтобы предварительно извлечь его экземпляр внешнего ключа.

5). Я продолжил и поднял случайную ошибку проверки в чистоте набора форм.

6). Что я обнаружил, что при возникновении ошибки у каждого запроса был свой запрос.Скажем, если в нем 100 строк, то запрос для этой строки был дублирован 100 раз.

7). Есть ли способ предварительно выбрать или оптимизировать этот сценарий, так как он вызывает слишком большое отставание в моем приложении

Вот код:

#model
class MyModel(models.Model):

user = models.ForeignKey(User, on_delete=models.CASCADE)
phone_number = models.CharField(max_length=10)
entity1 = models.ForeignKey("entities.entity1", null=True, blank=True, on_delete=models.CASCADE)
entity2 = models.ForeignKey("entities.entity2", null=True, blank=True, on_delete=models.CASCADE)
is_disabled = models.BooleanField(default=False)
name = models.CharField(max_length=24, blank=True, null=True)

class Meta:
    db_table = 'my_model'

def __str__(self):
    return "{}:{}".format(self.phone_number, self.entity2)


#admin
class Entity2Admin(admin.GeoModelAdmin, VersionAdmin):
list_filter = ('data_status')
readonly_fields = ('source', 'batch','is_live', )
exclude = ('search_key', 'live_at', 'qc_approved_at')

    def save_formset(self, request, form, formset, change):
        instances = formset.save(commit=False)

        for obj in formset.deleted_objects:
            obj.delete()

        for instance in instances:
            if isinstance(instance, MyModel):
                if (not instance.created_by):
                    instance.created_by = request.user
                if (not instance.id):
                    instance.some_field = some_value
            instance.save()
        formset.save_m2m()

inlines = [MyModelInline]

extra_js = ['js/admin/GoogleMap.js','https://maps.googleapis.com/maps/api/js?key=AIzaSyA-5gVhxxxxxxxxxxxxxxxxxxxxxxx&callback=initGoogleMap']


#MyModelInline
class MyModelInline(admin.TabularInline):
model = MyModel
extra = 0
can_delete = True
show_change_link = False
formset = MyModelFormSet
readonly_fields = ['user']
verbose_name_plural = "MyModels"
fields = ['phone_number', 'name', 'user', 'entity2']

def get_queryset(self, request):
    return super(MyModelInline, self).get_queryset(request).select_related('entity2', 'user')

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "entity2":
        object_id = request.resolver_match.kwargs.get('object_id')
        kwargs["queryset"] = Entity2.objects.filter(field=value)
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

Пожалуйста, помогите

...