Django администратор ужасной производительности get_form фильтр набора запросов при добавлении order_by - PullRequest
0 голосов
/ 20 февраля 2019

Я сталкиваюсь с некоторыми ужасными проблемами с производительностью при попытке отфильтровать набор запросов.

Я пытаюсь отфильтровать модель, в которой уже существуют отношения.

Код успешно выполнен.

Но мой набор запросов не упорядочен.

В тот момент, когда я изменяю на form.base_fields['sharepoint_mandate'].queryset = Sharepoint_Mandate.objects.filter(mandate_mapping_2__isnull=True).order_by('product_name'), запрос теперь занимает 25 секунд

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

models.py

class Mandate_Mapping_2(Trackable):
    mandate_mapping_id = models.AutoField(primary_key=True)  
    sharepoint_mandate = models.ForeignKey(Sharepoint_Mandate, on_delete=models.CASCADE)  
    sharepoint_product = models.ForeignKey(Sharepoint_Product, on_delete=models.CASCADE)  

admin.py

@admin.register(Mandate_Mapping_2)
class ChampMandateMapping2Admin(admin.ModelAdmin): 
    list_display =  ['sharepoint_mandate', 'sharepoint_product', 'approved']

    def get_form(self, request, obj=None, **kwargs):        
        form = super(ChampMandateMapping2Admin, self).get_form(request, obj, **kwargs)

        if 'change' in kwargs:
            if not kwargs['change']:
                form.base_fields['sharepoint_mandate'].queryset = Sharepoint_Mandate.objects.filter(mandate_mapping_2__isnull=True)
        return form

    def get_queryset(self, request):
        return super().get_queryset(request).select_related(
            'sharepoint_product', 
            'sharepoint_mandate',
        )

1 Ответ

0 голосов
/ 20 февраля 2019

При проверке существования Mandate_Mapping_2 для Sharepoint_Mandate вы делаете дополнительный запрос ни за что.Вы можете использовать атрибут имени столбца.

Sharepoint_Mandate.objects.filter(mandate_mapping_2_id=None).order_by('product_name')

Вы можете посмотреть "Использовать значения внешнего ключа напрямую" часть в Документы по оптимизации доступа к базе данных Django

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...