2014-02-13 46 views
0

我有3个模型。优化Django-SQL查询

class ShipmentPPTLMapping(models.Model): 
    pptl_id = models.CharField(max_length = 255) 
    shipment_id = models.ForeignKey('Shipment', related_name = 'pptls') 

class ShipmentBagSealMapping(models.Model): 
    bag_seal = models.CharField(max_length = 255) 
    status = models.CharField(max_length = 255, default = 'open') 
    shipment_id = models.ForeignKey('Shipment', related_name = 'bags') 



class Shipment(models.Model): 
    job_id = models.CharField(max_length = 255) 

我需要写过滤掉那些袋子from ShipmentBagSealMapping这是closed状态的查询,提供pptl_idfrom ShipmentPPTLMapping

我有一个pptl_id在开始。因为我过滤了所有与此有关的货物,因为shipments_objShipmentBagSealMapping有关,所以使用shipments_obj是我可以过滤掉封闭袋子的唯一方法。

shipment_pptl_mapping_obj_list = ShipmentPPTLMapping.objects.filter(pptl_id = pptl_id) 

然后我的shipment_pptl_mapping_obj_list周围循环来找到状态closed袋。

for shipment_pptl_mapping_obj in shipment_pptl_mapping_obj_list: 
    closed_bags = shipment_pptl_mapping_obj.shipment_id.bags.filter(status = 'closed') 
    #and then again another loop 
    for bags in closed_bags: 
     #something 

我怎样才能找到一切只是在1查询?

这是我的最终代码

shipment_pptl_mapping_obj_list = ShipmentPPTLMapping.objects.filter(pptl_id = pptl_id) #--> extend this 
for shipment_pptl_mapping_obj in shipment_pptl_mapping_obj_list: 
    closed_bags = shipment_pptl_mapping_obj.shipment_id.bags.filter(status = 'closed') 
    for bags in closed_bags: 
     #do something 

我想是这样的

closed_bags = Some Query 
for bags in closed_bags: 
    #do_something 

回答

1

首先纠正你的机型,外键的字段名不应该包含在最终_id。这将导致许多问题和失望后

class ShipmentPPTLMapping(models.Model): 
    pptl_id = models.IntegerField() # if you id is Integer of course 
    shipment = models.ForeignKey('Shipment', related_name = 'pptls') 

class ShipmentBagSealMapping(models.Model): 
    bag_seal = models.CharField(max_length = 255) 
    status = models.CharField(max_length = 255, default = 'open') 
    shipment = models.ForeignKey('Shipment', related_name = 'bags') 



class Shipment(models.Model): 
    job_id = models.IntegerField(max_length = 255) 

closed_bags = Shipment.objects.filter(pptls__pptl_id__exact=pptl_id, status='closed') 

这应该可以解决你的问题

+0

**错误**'无法解析关键字 'pptls' 到现场。选择是:bag_seal,id,shipment_id,status“}'' – PythonEnthusiast

+0

为什么FK的字段名称不应该包含'_id'?你指的是什么问题? – PythonEnthusiast

+1

Django为每个FK字段添加'_id'。这个问题是另一个程序员应该使用'name_id_id' –