python - 避免在 Django admin 上显示模型数据的多个查询

标签 python mysql django django-models django-admin

我正在将 Django amdin 用于我的一个数据模型。我想在每个模型的管理 UI 上显示自定义值。 在 db 上,单个查询的结果在 django admin 上作为多个查询运行,每一行一个 我正在努力避免这种情况。

这是我的模型:

class words(models.Model):
    word_id=models.AutoField(primary_key=True)
    word=models.CharField(max_length=200,unique=True)
    def __unicode__(self):
        return '%s - %s' % (self.word,self.word_id)

class meanings(models.Model):
    id=models.AutoField(primary_key=True)
    word_id=models.ForeignKey(words,on_delete=models.CASCADE,db_column='word_id')
    meaning=models.CharField(max_length=200)
    def __unicode__(self):
        return '%s  %s  %d ' % ( self.spelling_id.spelling,self.meaning,self.id)

对于第二个模型,在加载页面时,我看到每一行都有 2 个查询,一个在单词表上运行,另一个在含义表上运行。 (来自调试工具栏)

我尝试使用以下选项来避免这种情况。

模型.py:

class meanings(models.Model):
    meaning_id=models.AutoField(primary_key=True)
    word_id=models.ForeignKey(words,on_delete=models.CASCADE,db_column='word_id')
    meaning=models.CharField(max_length=200)

admin.py:

def modified_output(self):
        cursor = connection.cursor()
        cursor.execute("select word,meaning,id from meanings a,words b where a.word_id=b.word_id and meaning_id= "+str(self.id))
        row = dictfetchall(cursor)
        a=unicode(row[0]['word'])
        b=unicode(row[0]['meaning'])
        d=(row[0]['id'])
        return '%s  %s  %d ' % ( a,b,d)


meanings.add_to_class("__str__", modified_output)

现在,每行仅运行 1 个查询。但由于模型的依赖在一个查询的连接中包含超过2个表,因此仍然会消耗时间。所以我的问题是,我们是否可以直接为每个页面显示查询结果,而不是为每行运行 1 个查询。

例如页面上以下查询的结果:

select * from table ;

而不是

select * from table when id=1;
select * from table when id=2;
.
.
.

非常感谢任何帮助。谢谢

最佳答案

您应该使用list_select_related ModelAdmin 上的选项告诉 Django 执行 JOIN 查询。

class MeaningAdmin(admin.ModelAdmin):
    list_select_related = ('word_id',)

(注意,您确实不应该将 FK 字段称为 word_id 之类的名称。该字段可以访问 Word 的实际实例,因此应该将其称为 word; 底层数据库列将自动被称为 word_id。)

关于python - 避免在 Django admin 上显示模型数据的多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44719113/

相关文章:

Python:如何连接到 MySQL 数据库

python - 如何在卷积层pycaffe中设置bias_term false?

python - 继承方法的正确方法 1 更正

python - 如果坐标不超过阈值,则对列进行分组

python - 如何读取csv避免索引?

php - 从 MySQL 表自动检查 URL

mysql - 从相关表中获取每组的最大行数

django - 如何使用带有mongoengine的django rest过滤

django - Django 的 Comet 框架

python - Django crispy forms - 为多个字段设置标签文本