化学分子の保存を可能にするpostgresqlカートリッジを提供する化学情報ツールキットであるrdkitを使用しています。次のように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 では、次のような構文を使用して「smiles」文字列から「mol」列が作成されます。
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 オブジェクトを作成します。
保存中にデータベースにこの列の作成を処理させる必要があります。rdkit_mol 列に入力する mol_from_smiles 関数を実行する postgres でカスタム TRIGGER を定義できます。
また、django モデルを返す mol カスタム機能を使用してクエリを実行できるようにしたいと考えています。たとえば、SQL クエリの 1 つで、化学的にこのような化合物モデルを返すことができます。現在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の方法がありますか?