Django генерирует слишком много SQL запросов для моделей.ForeignKey - PullRequest
0 голосов
/ 25 марта 2020

A Класс модели имеет внешний ключ ( models.ForeignKey ), ссылающийся на другой класс Model .

Django генерирует слишком много SQL запросов для этого внешнего ключа. Когда класс admin.StackedInline использует класс Model , он пытается создать список выбора, содержащий все элементы в указанной таблице ( ProductTemplate в примере кода ниже).

Можно ли ограничить внешний ключ перечислением только одного элемента вместо всех элементов в указанной таблице?

Любые другие предложения также будут высоко оценены. Дайте мне знать, если вам нужно больше деталей.

In file admin.py:
...
class TransactionAttributeInlineAttribute(admin.StackedInline):
    model = models.TransactionAttribute
    verbose_name = 'Transaction Link'
    verbose_name_plural = 'Product Links'
class MyAttributeAdmin(admin.ModelAdmin):
    inlines = [TransactionAttributeInlineAttribute]
    list_display = ['name','datatype','required']
...


In file models.py:
...
class TransactionAttribute(models.Model):
    product_template = models.ForeignKey(ProductTemplate)
...

1 Ответ

0 голосов
/ 26 марта 2020

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

В моем случае, это поведение генерировало слишком много SQL запросов, которые перегружали базу данных. Исправление состоит в том, чтобы избавиться от выпадающего списка и ограничить Django показом только одного связанного элемента для внешнего ключа.

raw_id_fields = ['product_template']

См. дополнительные обсуждения по ссылке ниже: https://forum.djangoproject.com/t/models-foreignkey-caused-too-many-sql-queries/1649/5?u=simpleopen

Изменение кода для исправления:

class TransactionAttributeInlineAttribute(admin.StackedInline):
    model = models.TransactionAttribute
    raw_id_fields = ['product_template']
    verbose_name = 'Transaction Link'
    verbose_name_plural = 'Product Links'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...