优化查询我有以下的模型结构:Django的ORM:涉及到许多一对多的关系
class Container(models.Model):
pass
class Generic(models.Model):
name = models.CharacterField(unique=True)
cont = models.ManyToManyField(Container, null=True)
# It is possible to have a Generic object not associated with any container,
# thats why null=True
class Specific1(Generic):
...
class Specific2(Generic):
...
...
class SpecificN(Generic):
...
说,我需要检索所有Specific
型车型,具有与特定容器的关系。
对于这个问题的SQL或多或少是微不足道的,但这不是问题。不幸的是,我在处理ORM(尤其是Django的ORM)方面经验不足,所以我可能会在这里错过一个模式。
当一个强力的方式进行, -
c = Container.objects.get(name='somename') # this gets me the container
items = c.generic_set.all()
# this gets me all Generic objects, that are related to the container
# Now what? I need to get to the actual Specific objects, so I need to somehow
# get the type of the underlying Specific object and get it
for item in items:
spec = getattr(item, item.get_my_specific_type())
这导致一吨分贝命中(每个通用的记录,这涉及到一个容器),所以这显然是没有办法的办法去做吧。现在,它可能,也许,可以通过获取SpecificX直接做对象:
s = Specific1.objects.filter(cont__name='somename')
# This gets me all Specific1 objects for the specified container
...
# do it for every Specific type
这样的数据库将再次为每个特定类型(可以接受的,我猜)被击中。
我知道,.select_related()不适用于m2m关系,因此在这里没有多大帮助。
重申,最终结果必须是SpecificX对象的集合(非泛型)。
在反思,这个问题似乎有点毫无意义的我,现在的我已经提供了唯一可能的答案。毕竟,没有办法从任意字段的许多表中获得联合结果集。好吧,显然,这是一种方式,但它很丑,涉及动态sql和/或“select *”。我认为。 – shylent 2009-10-29 12:39:47
您的问题在这里的确与优化ManyToMany关系无关,并且与优化多表继承的查询无关。这确实是一个难题。 – 2009-10-29 14:30:22
现在我想起来了,让我相信这个问题是关于M2M关系的,事实上,select_related并不会遍历多对多的关系。 – shylent 2009-10-29 19:08:46