2013-03-23 3 views
5

(Der gesamte folgende Code ist eine vereinfachte Darstellung des tatsächlichen Codes).Django-Abfrage mit einfacher Arithmetik unter Modellfeldern und Vergleich mit Feld aus einem anderen Modell

Wenn ich die folgende Django Modelle haben: -

class Material(models.Model): 
    name = models.CharField(max_length=110) 

class OrderDetail(models.Model): 
    material = models.ForeignKey(Material) 
    order_quantity = models.IntegerField() 
    quantity_delivered = models.IntegerField(null=True, blank=True) 
    is_open = models.BooleanField() 
    is_active = models.BooleanField() 

class MaterialRequirement(models.Model): 
    material = models.ForeignKey(Material) 
    quantity = models.IntegerField() 

ich mit mir eine Instanz des MaterialRequirement Modell, nennen wir es material_requirement. Ich versuche OrderDetail Objekte abzurufen, die folgenden Kriterien erfüllen: -

1. material = material_requirement.material 

2. is_open = True 

3. is_active = True 

4. order_quantity > quantity_delivered 

5. material_requirement.quantity <= order_quantity - quantity_delivered 

Meine Frage ist, wie kann ich die fünften Auswahlkriterien in meiner ORM Abfrage unten einzubauen.

order_details = OrderDetail.objects.select_related('material').filter(material=material_requirement.material, 
                    is_open=True, 
                    is_active=True, 
                    order_quantity__gt=F('quantity_delivered')) 
+0

all Apologize - Punkt Nr. 5 sollte material_requirement.quantity <= order_quantity - quantity_delivered sein und nicht material_requirement.quantity> = order_quantity - quantity_delivered. Ich habe die Frage korrigiert. Nochmals, Entschuldigung. – chefsmart

Antwort

2
order_details = (OrderDetail.objects.select_related('material') 
       .filter(material=material_requirement.material, 
         is_open=True, 
         is_active=True, 
         order_quantity__gt=F('quantity_delivered'), 
         quantity_delivered__gte=F('order_quantity') - material_requirement.quantity, 
         ) 
) 
+0

Es gab einen Fehler in meiner Frage, bitte beachten Sie die Notizen bearbeiten. Jedenfalls bin ich mit dabei - beschuldige meine mentalen Spaghetti für Verwirrung. I am Ende mit order_details = OrderDetail.objects.select_related ('Material'). Filter (Material = material_requirement.material, istAuf = True, is_active = True, order_quantity__gte = F ('quantity_delivered') + material_requirement.quantity) – chefsmart

+0

Vielleicht möchten Sie Ihre Antwort aktualisieren, um die behobene Frage zu reflektieren, danke. – chefsmart

0
order_details = order_detail.extra(where=["order_quantity - quantity_delivered <= %d" % material_requirement.quantity]))