【问题标题】:Avoiding multiple queries to display model data on Django admin避免多次查询以在 Django admin 上显示模型数据
【发布时间】:2017-11-26 21:31:24
【问题描述】:

我将 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 个查询在单词表上运行,另一个在含义表上运行。 (来自调试工具栏)

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

models.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 个查询。但是由于对模型的依赖在一个查询的连接中有两个以上的表,它仍然会消耗时间。所以我的问题不是为每一行运行 1 个查询,我们可以直接为每一页显示查询结果吗?

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

select * from table ;

而不是

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

非常感谢任何帮助。谢谢

【问题讨论】:

    标签: python mysql django django-models django-admin


    【解决方案1】:

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

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

    (注意,您真的不应该将 FK 字段称为 word_id 之类的名称。该字段可以访问 Word 的实际实例,因此应将其称为 word;将自动调用底层 db 列word_id.)

    【讨论】:

    • 我不知道你的代码应该在哪里符合我的要求,如果我必须加入多个表怎么办。
    • list_select_related 是一个元组,所以猜猜更多然后加入。这进入 admin.py。它没有在模型上实现,因为它不属于模型。基本上,list_select_related 使用 query related tools 做正确的事情。
    • 我需要的 join 是 word 而不是 word id,我不明白这对我的要求有何帮助
    • 这是什么意思? word_id 是指向单词模型的外键,因此这将为您提供该模型。正如我所说,你应该给你的字段命名,真正代表它们是什么,那么这不会让你感到困惑。
    • 现在我明白了它的意思.. 但不明白当有多个表时同样适用
    猜你喜欢
    • 2017-09-14
    • 2015-02-16
    • 2018-12-12
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多