【问题标题】:Joining unrelated models and filter the queryset加入不相关的模型并过滤查询集
【发布时间】:2016-11-23 08:38:03
【问题描述】:

我想加入以下模特:

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 包含 3 个元素 AA BBB 和 CC,其值分别为 40、50 和 60。这种情况下的一个示例查询是 - 获取组件 AA 值大于 30 的所有数据点。

由于 Datacomponent 没有直接与 Datapoint 链接,我不知道如何组合这两个模型。目前我正在尝试在tastypie 库的get_object_list 中构建它。

任何帮助将不胜感激。

【问题讨论】:

    标签: django django-models tastypie


    【解决方案1】:

    您可以通过任意多个级别来跟踪关系。请记住始终从您需要其对象的类开始。对于您的示例查询,它看起来像:

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

    【讨论】:

    • 没想到这么简单!非常感谢您的回答:)
    • 还有一个问题,我有多个组件__name,每个组件的值必须大于或等于某个值(在这种情况下假设为 30)。由于所有表都将被连接,我如何只获取每个组件值为 gte 30 的组合数据点?
    猜你喜欢
    • 2016-01-08
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多