Django ManyToMany在一个查询中

时间:2010-10-01 10:19:00

标签: django django-models

我正在尝试通过将查询数量保持在最低限度来优化我的应用程序......我注意到在做这样的事情时我会收到很多额外的查询:

class Category(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=127, blank=False)

class Project(models.Model):
    categories = models.ManyToMany(Category)

然后,如果我想要检索项目和所有相关类别,我必须做这样的事情:

{% for category in project.categories.all() %}

虽然这样做我想要它在两个查询中这样做。我想知道是否有一种方法可以加入M2M领域,这样我只需一次查询即可获得所需的结果?我试过这个:

    def category_list(self):
    return self.join(list(self.category))

但它不起作用。

谢谢!

2 个答案:

答案 0 :(得分:0)

  

虽然我想做什么,却增加了额外的查询。

这是什么意思?您想使用一个查询选择Project 类别吗?

如果你的意思是这个,那么不幸的是,目前没有机制可以在不诉诸自定义SQL查询的情况下执行此操作。用于外键的select_related()机制在这里也不起作用。有一个Django ticket开放(但是?)但它已被Django开发者关闭为“wontfix”。

答案 1 :(得分:0)

你想要什么似乎不可能因为,

在DBMS级别,ManyToMany relatin是不可能的,因此需要一个中间表来连接具有ManyToMany关系的表。

在Django级别,对于你的模型定义,django创建一个ectra表来创建ManyToMany连接,使用你的两个表命名表,在这个例子中它将类似于* [app_name] _product_category *,并包含用于你的两个数据库表。

因此,您甚至无法通过django与模型过滤器中的 categories__name 关系进行多次连接来访问表中的字段或获取函数。