分组的行与条件
问题描述:
我有以下型号:分组的行与条件
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_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的合成。
我认为你的解决方案正是我在OP中展示的。这里的问题是,如果用户输入(0.5,0.6)组件1和(0.2,0.3)组件2,组合1和组合2将显示结果,因为我们结合了一个“或”。由于它与两个critereas匹配,因此所需的结果只是组合1。 – javaCity
我现在更了解您的问题。你实际上是在comp1和comp2符合标准的组合之后?编辑答案。 –