使用条件对行进行分组

时间:2016-12-01 03:54:07

标签: python django django-models

我有以下型号:

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.



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.

Datacomponent中,有多行具有相同的组合(这是Composition表的外键)。

我的最终目标是,如果每个组件值都在某些值的范围内,则设置Composition。在我下面显示的方法中,我根本没有得到任何composition_ids。

CompositionID   ComponentID  ComponentValue
   1               1            0.5
   1               2            0.3
   2               1            0.6
   2               2            0.4
   3               1            0.0
   3               2            0.1

因此上表的查询将是:'使用componentid = 1和componentvalue__range =(minn [a],maxx [b])获取所有合成ID。如果我们想要compID值gte 0.5 for componentID 1和gte 0.3 for componentID 2,我们的结果应该只是2,因为2的组件1是0.6而component2的值是0.4。

这是我的方法无效:

    queries = [Q(componentvalue__range = (minn[v], maxx[v]),
                 components__name    = "'"+v+"'",
                ) for v in minn]

    query = queries.pop()
    for item in queries:
        query |= item

    composition_ids = Datacomponent.objects.filter(query).values_list('composition_id', flat=True)

    print (composition_ids.count())

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么这样的事情可能会有所帮助

评论后编辑。 (我希望这次我能更好地理解你)。你实际上在Composition对象之后同时具有指定范围内的comp1和comp2(?)然后你可以实际从Composition模型中选择它们。

首先将 related_name 添加到composition模型中的Datacomponent字段,类似于" datacomp",以进行反向查询。

from django.db.models import Q

class Datacomponent(models.Model):
    composition = models.ForeignKey(Composition, related_name='datacomp', ..) 
    ...

comp_1_query = Q(datacomp__components_id=YOUR_COMP1_ID, datacomp__componentvalue_range=(YOUR_RANGE1_MIN, YOUR_RANGE1_MAX)
comp_2_query = Q(datacomp__components_id=YOUR_COMP2_ID, datacomp__componentvalue_range=(YOUR_RANGE2_MIN, YOUR_RANGE2_MAX)


Composition.objects\
           .select_related('datacomp')\ # you can for optimization  
           .filter(comp_1_query, comp_2_query)\ # Simply 'and' since you want both to match
           .values_list('id', 'datacomp__components_id', 'datacomp__componentvalue', flat=True)

这应该为您提供在指定范围内具有component1和component2的合成。