2014-02-13 2 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 ShipmentBagSealMappingclosed, которые, при условии pptl_idfrom ShipmentPPTLMapping.

У меня есть pptl_id с самого начала. При этом я отфильтровываю все отгрузки, связанные с этим, поскольку shipments_obj связан с ShipmentBagSealMapping, поэтому использование 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 добавить '_id' в каждое поле FK. id от 'object.name_id' или' object.name' для доступа к объекту. Обновлен ответ. Проблема в том, что другой программист должен использовать 'name_id_id' –

Смежные вопросы