我正在使用 rdkit 一个化学信息学工具包,它提供了一个 postgresql 墨盒以允许存储化学分子。我想创建一个 django 模型如下:
from rdkit.Chem import Mol
class compound(models.Model):
internal = models.CharField(max_length=10 ,db_index=True)
external = models.CharField(max_length=15,db_index=True)
smiles = models.TextField()
# This is my proposed custom "mol" type defined by rdkit cartridge and that probably maps
# to the Mol object imported from rdkit.Chem
rdkit_mol = models.MyCustomMolField()
所以我想将“rdkit_mol”映射到 rdkit postgres 数据库目录类型“mol”。在 SQL 中,“mol”列是从“smiles”字符串使用类似语法创建的
postgres@compounds=# insert into compound (smiles,rdkit_mol,internal,external) VALUES ('C1=CC=C[N]1',mol_from_smiles('C1=CC=C[N]1'), 'MYID-111111', 'E-2222222');
这些调用由墨盒定义的“mol_from_smiles”数据库函数来创建 mol 对象。
我是否应该让数据库在保存期间处理此列的创建。我可以让他们在 postgres 中定义一个自定义 TRIGGER,它运行 mol_from_smiles 函数来填充 rdkit_mol 列。
我还希望能够使用返回 django 模型的 mol 自定义功能执行查询。例如,其中一个 SQL 查询可以让我返回化学上看起来像这样的复合模型。目前在 SQL 我做
select * from compound where rdkit_mol @> 'C1=CC=C[N]1';
然后,这基本上返回了化学“化合物”对象。
我的问题是:鉴于我的领域的自定义性质。有没有办法将数据库“mol”类型的特征与 django 复合模型混合和匹配?有什么方法可以实现这一目标。
目前我倾向于不使用 Django ORM,而只使用原始 SQL 来回数据库。我想知道是否有使用这种自定义类型的 django 方式。
在我目前的混合方法中,我的观点看起来像这样。
def get_similar_compounds(request):
# code to get the raw smiles string for eg 'C1=CC=C[N]1' from a form
db_cursor.execute("select internal from compound where rdkit_mol @> 'C1=CC=C[N]1';")
# code to get internal ids from database cursor
similar_compounds = compound.objects.filter(internal__in = ids_from_query_above)
# Then process queryset
这种混合方法是否可取,或者是否有更多的 pythonic/django 方式来处理这种自定义数据类型。