我正在使用rdkit cheminformatics工具包,它提供了postgresql盒式磁帶以允許存儲化學分子。 我想創建一個Django模型如下:如何處理/將自定義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型「摩爾」。在SQL的「摩爾」列中,從「微笑」的字符串使用像
[email protected]=# 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」數據庫功能創建的。
我應該在保存期間讓數據庫負責保存這一列。我可以在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處理這種自定義數據類型的方式。
謝謝,很高興知道我在正確的軌道上。對於如何創建映射到rdkit mol類的自定義模型字段,我很困惑。部分問題是我不知道ORM如何構造和解構數據庫的值。所有的例子都是以文本爲中心的,這似乎更加微不足道。在這裏,我的mol對象不是真正的文本正確嗎?除非微笑字符串持有創建自定義字段的關鍵。任何關於如何寫這個自定義字段的指針? – harijay