2016-06-04 6 views
0

Ich versuche, in View mein Abfrage-Set basierend auf der Beziehung zwischen 2 Feldern zu filtern.Filtern von Abfrage-Set, wenn ein Wert größer ist als ein anderer Wert

aber immer den Fehler, dass mein Feld nicht definiert ist.

My Model mehrere berechnete Spalten hat, und ich möchte nur die Datensätze erhalten, wo Werte von Feld A sind größer als Feld B.

Das ist also mein Modell

class Material(models.Model): 
    version = IntegerVersionField() 
    code = models.CharField(max_length=30) 
    name = models.CharField(max_length=30) 
    min_quantity = models.DecimalField(max_digits=19, decimal_places=10) 
    max_quantity = models.DecimalField(max_digits=19, decimal_places=10) 
    is_active = models.BooleanField(default=True) 
    def _get_totalinventory(self): 
     from inventory.models import Inventory 


     return Inventory.objects.filter(warehouse_Bin__material_UOM__UOM__material=self.id, is_active = true).aggregate(Sum('quantity')) 


    totalinventory = property(_get_totalinventory) 

    def _get_totalpo(self): 

     from purchase.models import POmaterial  

     return POmaterial.objects.filter(material=self.id, is_active = true).aggregate(Sum('quantity')) 

    totalpo = property(_get_totalpo) 




    def _get_totalso(self): 

     from sales.models import SOproduct 

     return SOproduct.objects.filter(product__material=self.id , is_active=true).aggregate(Sum('quantity')) 

    totalso = property(_get_totalpo) 


    @property 
    def _get_total(self): 
     return (totalinventory + totalpo - totalso) 

    total = property(_get_total) 

Und dies ist in Zeile meiner Ansicht nach, wo ich versuche, die bedingte queryset

po_list = MaterialFilter(request.GET, queryset=Material.objects.filter(total__lte = min_quantity )) 

Aber ich erhalte den Fehler zu bekommen, dass min_quantity nicht

definiert

Was könnte das Problem sein?


EDIT:

Mein Problem gelöst habe danke @Moses Koledoye aber in der gleichen Code, den ich anderes Problem haben jetzt

Kann nicht Stichwort 'total' lösen in field.Choices sind: bin, autor, autor_id, bom, bomversion, code, creation_time, beschreibung, id, inventar, is_active, is_production, itemgroup, itemgroup_id, schlüsselwörter, materialuom, max_quantity, min_quantity, name, pomaterial, produzieren, produkt, slug, trigger_quantity, uom, update_by, updated_by_id, valid_from, valid_to, Version, warehousebin

Grundsätzlich zeigt es keine meiner berechneten Felder, die ich in meinem Modell habe.

Antwort

2

Django kann keine Abfrage schreiben, die von einem Feld abhängt, dessen Wert unbekannt ist. Sie benötigen einen F Ausdruck dafür verwenden:

from django.db.models import F 

queryset = Material.objects.filter(total__lte = F('min_quantity')) 

Und Ihre FilterSet wird:

po_list = MaterialFilter(request.GET, queryset = Material.objects.filter(total__lte=F('min_quantity'))) 

Vom docs:

Ein F() Objekt repräsentiert den Wert von ein Modellfeld oder eine annotierte Spalte. Es ermöglicht, auf Modellfeldwerte zu verweisen und Datenbankoperationen mit diesen durchzuführen, ohne sie tatsächlich aus der Datenbank in den Python-Speicher

zu ziehen
Verwandte Themen