【问题标题】:Django generates too many SQL queries for models.ForeignKeyDjango为models.ForeignKey生成太多SQL查询
【发布时间】:2020-03-24 21:56:56
【问题描述】:

一个 Model 类有一个外键 (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)
...

【问题讨论】:

    标签: python django


    【解决方案1】:

    对于外键,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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2021-02-20
      • 2012-09-28
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多