Я пытаюсь выяснить, как построить фильтр Django, который включает в себя термины, которые зависят от пользовательских функций (UDF), определенных в MySQL.
Мои пользовательские функции обрабатывают ветвь вычислительной химии, называемую хеминформатикой.Одна из функций (oe_matches) позволяет мне проверить, соответствует ли подструктура (выраженная как строка «SMARTS») структуре (выраженной как строка «SMILES»).Вы можете думать о них как о изоморфных регулярным выражениям, совпадающим со строкой.
В моей базе данных у меня есть таблица тем, называемая «Узлы».Содержит текст для поиска по теме исследования.Некоторая информация в теме касается молекул.У меня есть таблица молекул.Молекулы могут быть в более чем одной теме, а темы могут касаться более чем одной молекулы, поэтому у меня есть:
class Node(models.Model):
title = models.CharField()
content = models.CharField()
class Structure(models.Model):
smiles = models.CharField(max_length=255)
nodes = models.ManyToManyField(Node)
Теперь я хочу найти все узлы, которые имеют «тест» в заголовке или содержимом, и , которые соответствуют шаблону SMARTS "[C;! H0]" (то есть углеродам, по крайней мере, с одним водородом).
В идеале я хотел бы написать это следующим образом:
q = ((models.Q(title__icontains="test") |
models.Q(content__icontains="test")
).filter(models.Q(structure__node_smiles = oe_match(smarts="[C;!H0]")))
)
где oe_match - это что-то, что знает, как сгенерировать правильный внутренний код для MySQL, в данном случае 'oe_match ("[C;! H0]", Structure.smiles)' и где Djangoвидит структуру __dede_smiles и выполняет магию «многие ко многим», чтобы заставить части идти вместе.
Я вижу, что могу получить то, что хочу, с помощью интерфейса raw () как (по модулю незначительные синтаксические ошибки и использование неправильныхтип объединения):
SELECT * FROM Node, Node_Structure, Structure WHERE
((Node.title LIKE "%test%" OR Node.content LIKE "%test%") AND
(Node.id = Node_Structure.node AND
Node_Structure.structure = Structure.id) AND
oe_matches("[C;!H0]", Structure.smiles));
Я бы предпочел не смешивать и не сопоставлять слои моей базы данных таким образом.Кроме того, мне придется сделать некоторую реструктуризацию кода.(В настоящее время я создаю фильтр, который позже передаю модели для поиска.)
В более долгосрочной перспективе я хочу, чтобы другие использовали мои MySQL UDF для хеминформатики, и я думаю, что некоторый набор высокоуровневых вызовов Djangoдля моих потенциальных пользователей (кроме двух других, с которыми я работаю), это было бы хорошо, поэтому даже если бы я мог решить непосредственную проблему с помощью raw (), я все же хотел бы найти решение высокого уровня в долгосрочной перспективе.