2013-03-23 15 views
5

(Poniższy kod jest uproszczoną reprezentacją rzeczywistego kodu).Kwerenda Django z prostą arytmetyczną wśród pól modelu i porównanie z polem z innego modelu

Jeśli mam następujące modele 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() 

mam ze sobą wystąpienie modelu MaterialRequirement, nazwijmy to material_requirement. Próbuję odzyskać OrderDetail obiektów, które spełniają następujące kryteria: -

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 

Moje pytanie brzmi: w jaki sposób mogę włączyć 5. kryteria wyboru w moim zapytaniu ORM poniżej.

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

przeprosić wszystkich - punkt nr. 5 powinno być material_requirement.quantity <= order_quantity - quantity_delivered i not material_requirement.quantity> = order_quantity - quantity_delivered. Poprawiłem to pytanie. Znowu przepraszam. – chefsmart

Odpowiedz

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

Wystąpił błąd w moim pytaniu, zapoznaj się z uwagami do edycji. Tak czy owak, to jest to, po co poszedłem - obwiniać moje mentalne spaghetti za dezorientację. Skończyło się stosując order_details = OrderDetail.objects.select_related ('materiał'), filtr (materiał = material_requirement.material, is_open = prawda is_active = prawda order_quantity__gte = F ('quantity_delivered') + material_requirement.quantity) – chefsmart

+0

Być może zechcesz zaktualizować swoją odpowiedź, aby odzwierciedlić poprawione pytanie, dzięki. – chefsmart

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