我试图优化我的应用程序,将查询数量保持在最低限度.我注意到,在执行这样的操作时,我会收到很多额外的查询:
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))但这不管用。
谢谢!
发布于 2010-10-01 10:33:48
它在做我想做的事情的同时,增加了一个额外的查询。
这是什么意思?要使用一个查询获取Project 和其类别吗?
如果您的意思是这样的话,那么不幸的是,在不使用自定义SQL查询的情况下,目前没有任何机制可以做到这一点。用于外键的select_related()机制在这里也不能工作。有(曾经?)一个Django 票证为此打开,但却被Django开发人员作为"wontfix“关闭。
发布于 2010-10-01 10:44:40
你想要的似乎是不可能的,
在数据库管理系统级,ManyToMany关系是不可能的,因此需要一个中间表来连接具有ManyToMany关系的表。
在Django级别上,对于您的模型定义,django创建一个ectra表来创建一个ManyToMany连接,表是使用您的两个表命名的,在本例中它将类似于*app_name_product_category*,并且包含两个数据库表的外键。
因此,您甚至不能通过模型筛选器中带有这样的categories__name关系的django访问表中具有多个单元连接的字段,也不能访问get函数。
https://stackoverflow.com/questions/3838292
复制相似问题