2017-11-27 1 views
0
fällt

Ich versuche, meine Ergebnisse basierend auf zwei Eigenschaften meiner Abfrage festlegen, die in jeder Kombination von zwei Schwellenwert einer anderen Abfrage fällt. Hier ist ein Stück Code zur Klarstellung:kommentieren Sie ein Label zu Abfrage basierend auf Schwellenwerte, dass es in

threshold_query = threshold.objects.all() 
main_query = main.ojbects.values(
    'Athreshold', 'Bthreshold' 
).annotate(
    Case(
     When(
      Q(Avalue__lte=threshold_query['Avalue']) 
      & Q(Bvalue__lte=threshold_query['Bvalue']), 
      then=Value(threshold_query['label']) 
      ... 
     ) 
    ) 
) 

das Modell für die Schwellenwerte ist wie:

class threshold(models.Model): 
    Avalue = models.FloatField(default=0.1) 
    Bvalue = models.FloatField(default=0.3) 
    label = models.CharField(default='Accepted') 

so gibt es eine Matrix, die die Etiketten, beispielsweise entscheidet, wenn es zwei Schwellenwerte { 'Avalue ': 0.4,' Bvalue ': 0.6,' label ':' rejected '} und {' Avalue ': 0.7,' Bvalue ': 0.7,' label ': Accepted} wenn Sie die Werte auf der horizontalen Achse demonstrieren (Benennung der Zeile) der Matrix) und B-Werten auf der vertikalen Achse (Benennung der Spalte der Matrix), entscheidet die Kombination dieser beiden Schwellenwerte den Wert der Zelle, die "akzeptiert" oder "abgelehnt" wäre. Ist es möglich, mit einer Abfrage das zu erreichen, was mir in den Sinn kommt? mein Ziel ist es, die Anzahl der Abfragen aufgrund der enormen Datenmenge zu minimieren.

+0

Könnten Sie näher auf "so gibt es eine Matrix, die die Etiketten entscheidet." – rajkris

+0

sicher. zum Beispiel, wenn zwei Schwellenwerte vorhanden sind {'Wert': 0,4, 'Bwert': 0,6, 'Marke': 'abgelehnt'} und {'Wert': 0,7, 'Bwert': 0,7, 'Bezeichnung': akzeptiert} if Sie demonstrieren die Werte auf der horizontalen Achse (Benennung der Reihe der Matrix) und B-Werte auf der vertikalen Achse (Benennung der Spalte der Matrix), die Kombination dieser beiden Schwellenwerte entscheidet über den Wert der Zelle, die angenommen oder abgelehnt werden würde. – Azee

+0

Der Zweck besteht darin, die berechneten Werte der Hauptabfrage den Fuzzy-Schwellenwerten zuzuordnen, die von Experten bestimmt wurden. @RajKris – Azee

Antwort

0

Basierend auf einem comment in einer Follow-up-Frage, endete ich als eine Liste mit bis Wenn der Sache übergeben, so dass der Code so etwas wie ist:

args = [] 
for any_threshold in Threshold.objects.all(): 
    label = any_threshold.ThresholdValue 
    args.append(When(MainAvalue__lte= Avalue,MainBValue__lte= Bvalue,then=Value(label, output_field=CharField()))) 

und die Anmerkung ist wie:

MainLevel = Case(*args, default=Value('Rejected')) 

PS: Konnte nicht "Unterabfrage" basierend auf dem Grund verwendet here

0

Auf Django 1.11+ können Sie Unterabfragen verwenden:

from django.db.models import Subquery, OuterRef 

Main.objects.annotate(
    label=Subquery(
     Threshold.objects.filter(
      Avalue__gte=OuterRef('Athreshold'), 
      Bvalue__gte=OuterRef('Bthreshold'), 
     ).values('label')[:1] 
    ) 
) 

Wenn die Werte können mehr als einen Schwellenwert entsprechen, müssen Sie sich auf der inneren Abfrage eine konsistente Ordnung definieren.

+0

Danke @knbk. Allerdings sind die Werte "Avalue" und "Bvalue" im Hauptobjekt mit Anmerkungen versehen, daher in der "Unterabfrage" nicht verfügbar und das Fehlen eines Fremdschlüssels vom Schwellenwert zum Hauptmodell macht es unmöglich, sie in "Unterabfrage" zu kommentieren. Gibt es eine Problemumgehung? – Azee

Verwandte Themen