gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:13:37 24 4
gpt4 key购买 nike

有没有简单的方法让 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com