2

化学分子の保存を可能にする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の方法がありますか?

4

2 に答える 2

1

それを組み合わせる方法は、カスタムフィールドの実装を提供することです-あなたがすでに行っていることです。それ以上のことはありません。

カスタム フィールドには、その動作をカスタマイズするための非常に広範なプロトコルがあります。mol__in=sth値がデータベースに送信される前の動作、受信時の動作、特定のルックアップ (例: ) の使用時の動作をカスタマイズできます。

現在の開発バージョンの Django では、カスタム ルックアップ タイプを提供できるため、@>演算子を実装することもできます (ただし、公式の安定バージョンを使用することをお勧めします)。

結局のところ、それはあなたにとって何が簡単かによって異なります。の適切で一貫した実装を提供するには、MolField時間がかかることがわかります。したがって、必要な場所の数に大きく依存します。これらのいくつかの場所で生の SQL を使用する方がより実用的かもしれません。

于 2014-02-25T18:57:57.097 に答える