分组的行与条件

问题描述:

我有以下型号:分组的行与条件

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 

因此,对于上述表的查询会是:“获取所有组合物与IDS的ComponentID = 1和componentvalue__range =(明尼苏达州[A],MAXX [B])。如果我们希望componentID 1的comp值为0.5,componentID 2为0.3,我们的结果应该只是2,因为2的component 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()) 

如果我的理解是否正确,那么这样的事情可以帮助您的评论后

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

加上一个related_namecompositionDatacomponent模型,像“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的合成。

+0

我认为你的解决方案正是我在OP中展示的。这里的问题是,如果用户输入(0.5,0.6)组件1和(0.2,0.3)组件2,组合1和组合2将显示结果,因为我们结合了一个“或”。由于它与两个critereas匹配,因此所需的结果只是组合1。 – javaCity

+0

我现在更了解您的问题。你实际上是在comp1和comp2符合标准的组合之后?编辑答案。 –