gpt4 book ai didi

python - 如何处理/映射自定义 postgresql 类型到 Django 模型

转载 作者:行者123 更新时间:2023-11-29 12:21:19 26 4
gpt4 key购买 nike

我正在使用 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 数据库 catridge 类型“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 方法可以处理此类自定义类型。

在我当前的混合方法中,我的 View 如下所示。

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 方式来处理这种自定义数据类型。

最佳答案

混合的方法是提供自定义字段实现 - 您已经在做的事情。没有更多的了。

自定义字段有quite extensive protocol定制他们的行为。您可以自定义将值发送到数据库之前发生的情况、接收数据时发生的情况以及使用特定查找(例如 mol__in=sth)时发生的情况。

在当前的开发版本中,Django 允许提供自定义查找类型,因此您甚至可以实现 @> 运算符(尽管我建议坚持使用官方稳定版本)。

最后,这取决于对您来说更容易的事情。提供良好、连贯的 MolField 实现可能会耗费大量时间。因此,这实际上取决于您需要多少地方。在这几个地方只使用原始 SQL 可能更实用。

关于python - 如何处理/映射自定义 postgresql 类型到 Django 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22022163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com