Django admin内联预取对外关系

2024-04-26 21:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个相当常见的问题,django管理内联会执行一大堆不必要的查询来填充下拉列表。有4个模型-当我查看用户时,我希望看到与该用户相关联的UserClientRoles,并显示ClientRole名称和客户端。当我只使用角色名称时,它会为每个UserClientRole查询一次(如果有3个分配,它将查询3次)。如果我包含客户机名称,它会为每个UserClientRole查询一次每个客户机名称。在

我尝试过这里概述的解决方案(Django admin inline: select_related),但没有骰子。它不会改变行为。我还尝试在UserAdmin类上重写get_queryset方法,使其无效。我所做的一切都不能减少查询的数量。为了简洁起见,我删除了一些模型的细节。在

以下是模型:

class User(models.Model):
    id = models.AutoField(primary_key=True)
    email = models.CharField(unique=True, max_length=200)


class Client(models.Model):
    id = models.AutoField(primary_key=True)
    client_name = models.CharField(unique=True, max_length=200)
    client_identifier = models.CharField(unique=True, max_length=200)


class ClientRole(models.Model):
    client_role_id = models.AutoField(primary_key=True)
    role_name = models.CharField(unique=True, max_length=200)
    client = models.ForeignKey(Client)

    def __unicode__(self):
        return self.role_name + self.client_id.client_name


class UserClientRole(models.Model):
    user_client_role_id = models.AutoField(primary_key=True)
    client_role = models.ForeignKey(ClientRole)
    user = models.ForeignKey(User)

下面是管理模型:

^{pr2}$

有什么线索吗?在


Tags: key模型名称clientidtruemodelmodels
1条回答
网友
1楼 · 发布于 2024-04-26 21:15:46

尝试:

self.queryset.select_related('client_role', 'client_role__client')

Django并不总是最擅长决定选择哪些对象作为查询的一部分,尽管您可能认为Django ORM足够聪明,能够识别出这一点,因为您正在遍历一个形式为related_parent__related_child的关系,不是这样的,所以确保在select_related或{}中同时指定这两个参数对我来说是有效的。我建议你试试看!在

相关问题 更多 >