首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个查询中的Django ManyToMany

一个查询中的Django ManyToMany
EN

Stack Overflow用户
提问于 2010-10-01 10:18:59
回答 2查看 856关注 0票数 1

我试图优化我的应用程序,将查询数量保持在最低限度.我注意到,在执行这样的操作时,我会收到很多额外的查询:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
{% for category in project.categories.all() %}

虽然这样做是我想做的,但它在两个查询中都这样做了。我想知道是否有一种加入M2M字段的方法,这样我就可以只使用一个查询就可以得到我需要的结果?我试过这个:

代码语言:javascript
复制
    def category_list(self):
    return self.join(list(self.category))

但这不管用。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-10-01 10:33:48

它在做我想做的事情的同时,增加了一个额外的查询。

这是什么意思?要使用一个查询获取Project 其类别吗?

如果您的意思是这样的话,那么不幸的是,在不使用自定义SQL查询的情况下,目前没有任何机制可以做到这一点。用于外键的select_related()机制在这里也不能工作。有(曾经?)一个Django 票证为此打开,但却被Django开发人员作为"wontfix“关闭。

票数 0
EN

Stack Overflow用户

发布于 2010-10-01 10:44:40

你想要的似乎是不可能的,

在数据库管理系统级,ManyToMany关系是不可能的,因此需要一个中间表来连接具有ManyToMany关系的表。

在Django级别上,对于您的模型定义,django创建一个ectra表来创建一个ManyToMany连接,表是使用您的两个表命名的,在本例中它将类似于*app_name_product_category*,并且包含两个数据库表的外键。

因此,您甚至不能通过模型筛选器中带有这样的categories__name关系的django访问表中具有多个单元连接的字段,也不能访问get函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3838292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档