을 포함하는 최적화 쿼리 나는 다음과 같은 모델 구조를 가지고 :장고 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은 그다지 사소하지만 그다지 문제되지 않습니다. 불행히도, 나는 ORMs (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())
이 (컨테이너 관련 각 일반 레코드 하나) DB 안타의 톤 결과, 그래서 이것은 분명히 방법이 아니다 그것을하기 위해. 이제, 그것은 아마의 SpecificX을 받고 수행 할 수있는 직접 객체 : DB를 각 특정 유형 (허용, 나는 추측)에 대해 한 번 타격을받을 것입니다
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 및/또는 "선택 *"가 포함됩니다. 나는 생각한다. – shylent
귀하의 질문은 실제로 ManyToMany 관계를 최적화하는 것과 아무런 관련이 없으며 다중 테이블 상속에 대해 쿼리를 최적화하는 것과 관련이 있습니다. 참으로 어려운 문제입니다. –
이 문제는 m2m 관계와 관련이 있다고 생각하게되었습니다. 실제로 select_related가 many-to-many 관계를 횡단하지 않는다는 사실입니다. – shylent