我有以下型号:
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())
答案 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的合成。