python - Django ORM : Selecting related set

标签 python django orm

假设我有 2 个模型:

class Poll(models.Model):
    category = models.CharField(u"Category", max_length = 64)
    [...]

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    [...]

给定一个 Poll 对象,我可以查询它的选择:

poll.choice_set.all()

但是,是否有一个实用函数可以从一组 Poll 中查询所有选项?

实际上,我正在寻找类似以下的东西(不支持,我也不寻求它是如何实现的):

polls = Poll.objects.filter(category = 'foo').select_related('choice_set')
for poll in polls:
    print poll.choice_set.all() # this shouldn't perform a SQL query at each iteration

我制作了一个(丑陋的)函数来帮助我实现这一目标:

def qbind(objects, target_name, model, field_name):
    objects = list(objects)
    objects_dict = dict([(object.id, object) for object in objects])
    for foreign in model.objects.filter(**{field_name + '__in': objects_dict.keys()}):
        id = getattr(foreign, field_name + '_id')
        if id in objects_dict:
            object = objects_dict[id]
            if hasattr(object, target_name):
                getattr(object, target_name).append(foreign)
            else:
                setattr(object, target_name, [foreign])
    return objects

具体用法如下:

polls = Poll.objects.filter(category = 'foo')
polls = qbind(polls, 'choices', Choice, 'poll')
# Now, each object in polls have a 'choices' member with the list of choices.
# This was achieved with 2 SQL queries only.

Django 是否已经提供了一些更简单的东西?或者至少,一个片段以更好的方式做同样的事情。

你通常如何处理这个问题?

最佳答案

时间已经过去,现在 Django 1.4 中引入了 prefetch_related()查询集函数。此函数有效地执行建议的 qbind 函数执行的操作。 IE。执行了两个查询,连接发生在 Python 领域,但现在由 ORM 处理。

原来的查询请求现在变成:

polls = Poll.objects.filter(category = 'foo').prefetch_related('choice_set')

如以下代码示例所示,polls QuerySet 可用于获取每个 Poll 的所有 Choice 对象,而无需任何进一步数据库命中:

for poll in polls:
    for choice in poll.choice_set:
        print choice

关于python - Django ORM : Selecting related set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/853184/

相关文章:

python - 如何将字典键与模型 ID 匹配

python - (staticfiles.W004)Django中STATICFILES_DIRS设置中的目录不存在错误

c++ - ORM 获取连接表行数

java - 使用@ManyToMany 自引用对称 Hibernate 映射表

python - 如何使用flask-login从数据库中注销用户

python - 如何在我想要导入的模块中模拟一些功能?

python - 如何正确处理 python 脚本命令行中一个选项的两个参数?

python - 使用 Sympy 方程式绘图

django - 依靠 Django 查询集中的多个字段

swift - 快速、 Vapor 和流畅的顺序数据库访问