django:选择与条目集相关的

django:选择与条目集相关的,django,django-models,django-select-related,Django,Django Models,Django Select Related,是否应使用select\u related缓存条目\u集?即使在我使用select_related之后,我的数据库仍然收到呼叫。相关章节 class Alias(models.Model): achievements = models.ManyToManyField('Achievement', through='Achiever') def points(self) : points = 0 for a in self.achiever_set

是否应使用select\u related缓存条目\u集?即使在我使用select_related之后,我的数据库仍然收到呼叫。相关章节

class Alias(models.Model):
    achievements = models.ManyToManyField('Achievement', through='Achiever')

    def points(self) :
        points = 0
        for a in self.achiever_set.all() :
            points += a.achievement.points * a.count
        return points

class Achievement(models.Model):
    name = models.CharField(max_length=100)
    points = models.IntegerField(default=1)

class Achiever(models.Model):
    achievement = models.ForeignKey(Achievement)
    alias = models.ForeignKey(Alias)
    count = models.IntegerField(default=1)

aliases = Alias.objects.all().select_related()
for alias in aliases :
    print "points : %s" % alias.points()
    for a in alias.achiever_set.all()[:5] :
        print "%s x %d" % (a.achievement.name, a.count)
我在一开始看到一个大的连接查询,然后是每个成就的单独调用。用于点和名称查找

这是一个bug,还是我做错了什么?

Select\u related()不适用于许多领域。目前,这还不是计划中的,但可能是未来的功能。看

在本例中,如果要进行单个查询,则有两个选项 1) 创建自己的SQL,可能不会很快。
2) 您还可以使用foreignkey查询模型。在这种情况下,您可以使用select_related。您仍然无法访问modelname_集,但通过一些格式设置,您可以在单个查询中检查所需的数据。没有一个选项是理想的,但你也可以让它以快得令人窒息的速度工作

在Django 1.3中,您可以使用Queryset.values()并执行以下操作:

Alias.objects[.filter().exclude() etc.].values('achievements__name', 'achievement__points')
唯一的drwaback是您得到的是QuerySetList而不是QuerySet。但这可以通过将所有必要的字段传递到值()来简单地克服-您必须改变您的感知;)

这可以为您节省一些查询

详细信息可在django文档中找到:

在Django 1.4中,您可以使用与预回迁相关的功能,这将适用于许多关系:


糟糕透了。你会建议我怎么做这个查询?手动SQL?对于任何阅读者,M2M和反向FK的
select_related()
等效值为
prefetch_related()
,并在1.4中添加。