2016-11-23 16 views
0

をフィルタリング:無関係なモデルを結合し、私は参加したいと思い、次のモデル持っているクエリセット

Datapoint

class Datapoint(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    composition = models.ForeignKey(Composition, models.DO_NOTHING, db_column='Composition', blank=True, null=True) # Field name made lowercase. 
    value = models.IntegerField(db_column='Value') # Field name made lowercase. 

Composition

class Composition(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    name = models.CharField(db_column='Name', max_length=45, blank=True, null=True) # Field name made lowercase. 

DataComponent

class Datacomponent(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    composition = models.ForeignKey(Composition, models.DO_NOTHING, db_column='Composition_ID', null=True, blank=True) # Field name made lowercase. 
    components = models.ForeignKey(Components, models.DO_NOTHING, db_column='Components_ID') # Field name made lowercase. 
    componentvalue = models.FloatField(db_column='ComponentValue') # Field name made lowercase. 

そして最後に、Component

class Components(models.Model): 
    id = models.IntegerField(db_column='ID', primary_key=True) # Field name made lowercase. 
    name = models.CharField(db_column='Name', max_length=45, blank=True, null=True) # Field name made lowercase. 

各データポイントは、組成物テーブルへの外部キーが含まれています。したがって、DatapointCompositionのテーブルは関連しています。各コンポジションには、[コンポーネント]テーブルの外部キーを含むDatacomponentテーブルのコンポジションフィールドによってリンクされている多くのコンポーネントがあります。

最後の目標は、Datacomponentsテーブルの特定のコンポーネント値でフィルタリングされたDatapointオブジェクトのリストを作成することです。

たとえば、いくつかのデータポイントがあるとします。 2つのコンポジションAとBを持っていれば、Aは2つの要素AAとBBを含み、値はそれぞれ30と50です。 Bは、値40,50、および60の3つの要素AA BBBおよびCCをそれぞれ含む。このシナリオでは、コンポーネントAAの値が30より大きいすべてのデータポイントを取得します。

Datacomponentはデータポイントに直接リンクされていないため、これらの2つのモデルを結合する方法はわかりません。現在私はこれをget_object_listtastypieライブラリに構築しようとしています。

ご協力いただければ幸いです。

答えて

1

あなたは好きなだけ多くのレベルを通して関係を追跡することができます。必要なオブジェクトを持つクラスから常に始めることを忘れないでください。あなたのクエリ例では、次のようになります:

Datapoint.objects.filter(
    composition__datacomponent__component_value__gte=30, 
    composition__datacomponent__components__name='AA' 
) 
+0

これは簡単なのですか?お返事ありがとうございます:) – javaCity

+0

もう1つの質問ですが、私は複数のcomponents__nameを持ち、各コンポーネントの値はある値以上でなければなりません(この場合は30とします)。すべてのテーブルが結合されるので、各コンポーネントの値がgte 30の構成のデータポイントのみを取得するにはどうすればよいですか? – javaCity

関連する問題