我正在尝试通过将查询数量保持在最低限度来优化我的应用程序......我注意到在做这样的事情时我会收到很多额外的查询:
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))
但它不起作用。
谢谢!
答案 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 关系进行多次连接来访问表中的字段或获取函数。