2017-05-15 13 views
0

こんにちは私は自分のプロジェクトで3つのモデルを持っていて、内部結合クエリを実行したいと思います。Django inner Joinデータベースクエリ

class Experiment(models.Model): 
    experiment_id = models.AutoField(primary_key=True) 
    experiment_name = models.CharField(max_length=500) 

class DataFile(models.Model): 
    file_id = models.AutoField(primary_key=True) 
    file_name = models.CharField(max_length=500) 
    experiment_id = models.IntegerField(blank=True, null=True) 
    date = models.DateTimeField(blank=True) 
    created_on = models.DateTimeField(auto_now_add=True) 

class Analysis(models.Model): 
    sample_name = models.CharField(max_length=500) 
    file_id = models.IntegerField(blank=True, null=True) 

私は

Experiment.objects.filter(experiment_id__sample_name=18) 
を試みた実験のID を使用して、すべてのサンプル名の名前を抽出したい私はpostgreを使用していると私がしようとしているクエリが

select experiment_name,ma.rt 
FROM main_experiment me 
INNER JOIN main_datafile md 
ON me.experiment_id = md.experiment_id 
INNER JOIN main_analysis ma 
ON ma.file_id = md.file_id 

です

と他の多くの組み合わせが、私は常に以下のエラーを取得します。

フィールドでAutoFieldまたはジョインにサポートされていないルックアップ ''がサポートされていません。

+0

をチェックしましたか? http://stackoverflow.com/questions/42984676/django-equivalent-for-sql-query-using-inner-join-clause – giaco

+0

@giacoはい私はAnalysis.objects.filter(sample_name__file_id = 257)を試しましたが、上記のエラー – dexter

答えて

0

なぜ外部キーを使用しないのですか?あなたのモデルが見える場合。

class Experiment(models.Model): 
    #experiment_id = models.AutoField(primary_key=True) # you don't need to add, django will do it for you. 
    experiment_name = models.CharField(max_length=500) 

class DataFile(models.Model): 
    #file_id = models.AutoField(primary_key=True) # you don't need to add, django will do it for you. 
    file_name = models.CharField(max_length=500) 
    experiment = models.ForeignKey(Experiment, related_name="data_file") 
    date = models.DateTimeField(blank=True) 
    created_on = models.DateTimeField(auto_now_add=True) 

class Analysis(models.Model): 
    sample_name = models.CharField(max_length=500) 
    data_file = models.ForeignKey(DataFile, related_name="analysis") 

次に、あなたが行うことができます:あなたは

Experiment.objects.filter(data_file__analysis__sample_name= 18) 
+0

返信ありがとう、データベースはすでに作成されているとそこにデータがありますが、現在のテーブル構造を変更することなくそれを行うための簡単な方法ですか? – dexter

+0

@dexter:私はそれを行うには、実際にモデルの構造を変更する場合は、ForeignKeyとちょうどマイグレーションを偽装し、うまくいくはずです。 experiment_id = models.IntegerField(空白= True、null = True)はexperiment_id = models.ForeignKey(実験、空白= True、related_name = "data_file"、null = True)になります。 file_id = models.ForeignKey(DataFile、related_name = "分析")。 –

+0

または、次のように指定することもできます。 analysis = object.filter(sample_name = 18).values_list( "file_id"、flat = True) datafiles = DataFile.objects.filter(file_id__in = analysis).values_list( "experiment_id "、flat = True) experiments = Experiment.objects.filter(experiment_id__in = datafiles) –