2013-03-23 6 views
5

(Aşağıdaki kodun tamamı gerçek kodun basitleştirilmiş bir temsilidir).Model alanları arasında basit aritmetik ile Django sorgu ve başka bir modelden alan ile karşılaştırma

Aşağıdaki Django modellerini varsa: -

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

Yanımda MaterialRequirement modelinin bir örneğini var, hadi material_requirement diyelim.

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 

Sorum aşağıda benim ORM sorguda 5 seçim kriterlerini dahil nasıl olduğunu: - Ben aşağıdaki ölçütleri karşılayan OrderDetail nesneleri almak için çalışıyorum.

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

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

cevap

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

Sorumumda bir hata oluştu, lütfen düzenleme notlarına bakın. Her neyse, gittiğim şey şuydu - zihinsel spagetti'm kafamı karıştırdığı için suçluyorum. I filtre. Order_Details = OrderDetail.objects.select_related ('madde') kullanılarak sona erdi (çıkış malzemesi = material_requirement.material, is_open = Doğru, is_active = Doğru, order_quantity__gte = F ('quantity_delivered') + material_requirement.quantity) – chefsmart

+0

Cevabınızı, düzeltilmiş soruyu yansıtacak şekilde güncellemek isteyebilirsiniz, teşekkürler. – chefsmart

0
tüm Özür - hayır etmektedir. 5, material_requirement.quantity <= order_quantity - quantity_delivered ve material_requirement.quantity> = order_quantity - quantity_delivered olmalıdır. Soruyu düzelttim. Yine özür dilerim.