我正在将 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/