2011-04-18 51 views
3

我想弄清楚如何构建一个Django过滤器,其中包含依赖于MySQL中定义的用户定义函数(UDF)的术语。如何在Django中使用MySQL用户定义函数(UDF)?

我的UDF处理称为化学信息学的计算化学分支。其中一个函数(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在这里看到结构_node_smiles,并执行其多对多的魔法来使这些部分结合在一起。

我看到,我能得到我想要的东西与原料()接口(模数小的语法错误和使用错误的连接类型):

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()解决眼前的问题,我仍然想知道长期的高级解决方案。

回答

相关问题