mysql - Django Admin 外键从单个 SQL 查询中下拉

标签 mysql django-models django-forms

有没有简单的方法让 Django 使用单个 SQL 查询填充外键的下拉列表?

考虑以下模型;

class Site(models.Model):
    code = models.CharField(max_length=5)
    name = models.CharField(max_length=45)

    def __unicode__(self):
        return u'%s - %s' % (self.code, self.name)

class Location(models.Model):
    site = models.ForeignKey(Site)
    name = models.CharField(max_length=45, verbose_name='Location Name')

    def __unicode__(self):
        return u'%s - %s' % (self.site, self.name)

然后其他模型包括 models.ForeignKey(Location) 并且为了选择它们,这些模型呈现在 admin.ModelAdmin 表单中作为下拉列表。

使用 django-debug-toolbar 我可以看到,在填充下拉菜单时,我对每个具有 site_id 值的 Location 项目执行了以下查询;

SELECT 
  `myApp_site`.`id`, 
  `myApp_site`.`code`, 
  `myApp_site`.`name` 
FROM `myApp_site` 
WHERE `myApp_site`.`id` = 1

我可以看出这是因为我在 def __unicode__(self) 中使用了 self.site,因为我想查看每个位置的站点。

我尝试在 admin.ModelAdmin 中使用 list_select_related = True 但这只是针对实例上的相关数据,而不针对表单中的可能值。

通常整个外键下拉列表可以从单个查询中填充;

SELECT 
  `myApp_location`.`id`, 
  `myApp_location`.`name`,
  `myApp_site`.`code`, 
  `myApp_site`.`name` 
FROM `myApp_site`
INNER JOIN `myApp_site` ON (`myApp_location`.`site_id` = `myApp_site`.`id`)

我可以强制 Location 模型使用 select_related() 并消除查询吗?

是否有更好的方法来将站点包含在位置中或减少 Django 正在执行的查询数量?

是否有我陷入的 Django 反模式?我有几个这样的外键字段,我担心随着数据库填满而增加的查询数量。

最佳答案

试试 AdminClass 上的 formfield_for_foreignkey 方法,在那里你可以覆盖 ForeignKey 的查询集。请参见下面的示例

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'location':
        kwargs["queryset"] = Location.objects.select_related('site').all()
    return super(ModelWithLocationAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

关于mysql - Django Admin 外键从单个 SQL 查询中下拉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866216/

相关文章:

python - 我怎样才能跟随一个 Django 反向外键,然后跟随另一个反向外键?

python - 支付完成后无法显示成功页面

Django - CreateView - 如何声明变量并在模板中使用它

python - 使用标签而不是字段名称呈现表单错误

mysql - 如何使用mysql查询计算到期日期?

php - 我如何查看调用 mysqli->prepare 产生的查询的最终文本?

python - 在 Django 中分组

javascript - 使用 django-dynamic-formset 创建表单集工厂时出错

php - 这些数据库调用可以优化吗?

mysql - 索引创建优化