Mam następującą strukturę modeluDjango ORM: optymalizacja zapytań obejmujących wiele do wielu relacji
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):
...
powiedzieć, że trzeba pobrać wszystkie Specific
modele Type, które mają związek z danym pojemniku.
SQL jest mniej lub bardziej banalny, ale to nie jest pytanie. Niestety, nie mam dużego doświadczenia w pracy z ORMami (w szczególności ORM Django), więc być może brakuje mi tutaj wzoru.
Kiedy odbywa się w sposób brute-force, -
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())
skutkuje ogromną ilością db trafień (po jednym dla każdej Generic rekordu, który odnosi się do pojemnika), więc nie jest to oczywiście droga aby to zrobić. Teraz to może być może być wykonane przez coraz SpecificX obiektów bezpośrednio:
s = Specific1.objects.filter(cont__name='somename')
# This gets me all Specific1 objects for the specified container
...
# do it for every Specific type
że droga db będzie hit raz dla każdego typu Specific (dopuszczalne, chyba).
Wiem, że .select_related() nie działa z relacjami m2m, więc nie ma tu zbytniej pomocy.
Aby powtórzyć, wynik końcowy musi być zbiorem obiektów SpecificX (nie generycznych).
W retrospekcji, pytanie wydaje się nieco bezcelowe mnie teraz jak już pod warunkiem, że jedyną możliwą odpowiedź. W końcu nie ma sposobu na uzyskanie wspólnego zestawu wyników z wielu tabel z dowolnymi polami. Ok, oczywiście, to jest sposób, ale jest brzydki i wymaga dynamicznego sql i/lub "wybierz *". Myślę. – shylent
Twoje pytanie tutaj naprawdę nie ma nic wspólnego z optymalizacją relacji ManyToMany i wszystko, co ma związek z optymalizacją zapytań dotyczących dziedziczenia z wielu tabel. To naprawdę trudny problem. –
Teraz, gdy o tym myślę, co skłoniło mnie do uwierzenia, że ta kwestia dotyczy relacji m2m, jest tak naprawdę faktem, że selekcja dobrana nie prowadzi przez wiele do wielu relacji. – shylent