У меня есть древовидная структура, созданная из моделей с использованием ForeignKey
связей. Как пример:
Model Person:
name = CharField
Model Book:
name = CharField
author = FK(Person)
Model Movie:
name = CharField
director = FK(Person)
Model Album:
name = CharField
director = FK(Person)
Model Chapter:
name = CharField
book = FK(Book)
Model Scene:
name = CharField
movie = FK(Movie)
Model Song:
name = CharField
album = FK(Album)
Предостережение в том, что реальная структура глубже и шире, и
узел может иметь несколько не-FK полей (т. е. не просто «имя»).
Что я хотел бы сделать, так это иметь функцию поиска, в которой есть строка
предоставляется, который будет возвращать любого человека, который соответствует объекту Person
сам, или поле в любом из дочерних узлов. IOW, если «бить это»
строка и название песни, связанной с альбомом, связанным с
человек совпадает, человек будет возвращен.
На данный момент я сделал следующее:
Для любого конечного узла есть объект Manager с методом поиска, который делает
что-то вроде:
return Song.objects.filter(name__icontains=search_string)
Тогда для корневого узла (Person) и любых внутренних узлов также существует
Объект менеджера с методом search (), который выглядит примерно так:
class AlbumManager(models.Model):
def search(self, search_string):
from_songs = Album.objects.filter(song__in=Song.objects.search(search_string))
return Album.objects.filter(name__icontains=search_string)|from_songs
Как вы можете себе представить, как только вы доберетесь до корневого узла, это высвобождает
огромное количество запросов и действительно неэффективно. Я бы хорошенькая
Удивлен, если не было лучшего способа сделать это ... одна идея просто
есть один метод search () в верхней части дерева, который выполняет поиск вручную
через все, но а) это выглядит очень грязно (хотя, вероятно, больше
эффективный) и б) было бы неплохо иметь возможность поиска отдельных узлов
произвольно.
Итак, со всем сказанным, что было бы более эффективным методом получения
где я хочу быть вместо моего метода тупица здесь?