2013-03-23 13 views
5

(Tất cả mã bên dưới là biểu diễn đơn giản của mã thực tế).Truy vấn Django với số học đơn giản giữa các trường mô hình và so sánh với trường từ mô hình khác

Nếu tôi có các mô hình Django sau: -

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

tôi có với tôi một ví dụ của mô hình MaterialRequirement, chúng ta hãy gọi nó material_requirement. Tôi cố gắng để lấy OrderDetail đối tượng đáp ứng các tiêu chí sau: -

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 

Câu hỏi của tôi là làm thế nào để kết hợp các tiêu chí lựa chọn thứ 5 trong truy vấn ORM của tôi dưới đây.

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

Apologize cho tất cả - chỉ không. 5 nên được material_requirement.quantity <= order_quantity - quantity_delivered và không material_requirement.quantity> = order_quantity - quantity_delivered. Tôi đã sửa chữa câu hỏi. Một lần nữa, xin lỗi. – chefsmart

Trả lời

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

Đã xảy ra lỗi trong câu hỏi của tôi, vui lòng xem ghi chú chỉnh sửa. Dù sao, đây là những gì tôi đã đi với - đổ lỗi cho mì spaghetti tinh thần của tôi để bị nhầm lẫn. Tôi đã kết thúc bằng ORDER_DETAILS = OrderDetail.objects.select_related ('tài liệu'). Lọc (chất liệu = material_requirement.material, is_open = True, is_active = True, order_quantity__gte = F ('quantity_delivered') + material_requirement.quantity) – chefsmart

+0

Bạn có thể muốn cập nhật câu trả lời của mình để phản ánh câu hỏi đã được chỉnh sửa, cảm ơn. – chefsmart

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