I haben die folgenden Modelle:Grouping Reihen mit Bedingung
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.
In Datacomponent
gibt es mehrere Reihen von gleicher Zusammensetzung (die Composition
Tabelle Fremdschlüssel ist).
Mein Endziel ist es, Composition
gesetzt zu bekommen, wenn jeder seiner Komponenten Werte im Bereich einiger Werte sind. In meinem unten gezeigten Ansatz bekomme ich überhaupt keine 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
So ist die Abfrage für obige Tabelle wäre: ‚Holen Sie sich alle Zusammensetzung ids mit ComponentID = 1 und componentvalue__range = (Minn [a], maxx [b]). Wenn wir den Comp-Wert gte 0,5 für componentID 1 und gte 0,3 für componentID 2 haben möchten, sollte unser Ergebnis nur 2 sein, weil die Komponente 2 von 2 0,6 und der Wert von component2 0,4 ist.
Hier ist mein Ansatz, der nicht funktioniert:
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())
Ich denke, Ihre Lösung ist genau das, was ich im OP gezeigt habe. Das Problem hier ist, dass wenn Benutzereingaben (0,5, 0,6) für Komponente1 und (0,2, 0,3) für Komponente2 sowohl Komposition1 als auch Komposition2 im Ergebnis angezeigt werden, da wir mit einem 'oder' kombiniert haben. Das gewünschte Ergebnis ist nur composition1 im Ergebnis zu sein, da es beiden Kriterien entspricht. – javaCity
Ich verstehe jetzt deine Frage besser. Sie sind tatsächlich nach Kompositionen, die sowohl comp1 als auch comp2 in übereinstimmenden Kriterien haben? Bearbeitete die Antwort. –