2013-03-23 15 views
5

(Tutto il codice seguente è una rappresentazione semplificata del codice effettivo).Interrogazione Django con aritmetica semplice tra campi modello e confronto con campo di un altro modello

Se ho i seguenti modelli: Django -

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() 

Ho con me un esempio del modello di MaterialRequirement, chiamiamolo material_requirement. Sto cercando di recuperare OrderDetail oggetti che soddisfano i seguenti criteri: -

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 

mia domanda è come faccio a incorporare i criteri di selezione 5 ° nella mia interrogazione ORM di seguito.

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

scusa a tutti - lettera n. 5 dovrebbe essere material_requirement.quantity <= order_quantity - quantity_delivered e non material_requirement.quantity> = order_quantity - quantity_delivered. Ho corretto la domanda. Di nuovo, scuse. – chefsmart

risposta

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

C'è stato un errore nella mia domanda, per favore vedi le note di modifica. Ad ogni modo, questo è quello con cui sono andato - incolpare i miei spaghetti mentali per essere confusi. Ho finito per usare Order_Details = OrderDetail.objects.select_related ('materiale'). Filtrare (materiale = material_requirement.material, is_open = True, is_active = True, order_quantity__gte = F ('quantity_delivered') + material_requirement.quantity) – chefsmart

+0

È possibile aggiornare la risposta in modo che rispecchi la domanda rettificata, grazie. – chefsmart

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